技術的な知見や日々の記録、日常の些細な変化などを綴る雑記ブログです。専門的な技術解説から日記のようなライトな話題まで、特定のジャンルに縛られず、気になったことや面白いと感じた出来事を幅広く発信しています。筆者の視点で切り取った多様なコンテンツが楽しめる、自由な雑記空間を目指しています。
2023/10/12
2023/10/05
webサイトでjsonをformatしたいのだけど。
現代のシステム開発において、システム間の通信を支えるJSONは必要不可欠な存在となりました。REST APIのレスポンスや設定ファイル、ログデータなど、エンジニアがこのデータ形式に触れない日はありません。しかし、機械が読みやすいように最適化された一行のデータは、人間がその構造を直感的に把握することを困難にします。
多くのエンジニアは、この読みづらいデータを整えるために検索エンジンで見つけたオンラインツールを利用しがちです。しかし、そこには見過ごせないリスクが潜んでいます。入力したデータが外部サーバーに送信されてログに残る懸念や、通信経路での傍受、あるいは運営者によるデータの二次利用を完全に否定することはできません。顧客の個人情報や認証トークン、秘匿性の高いビジネスロジックを含むデータを外部に預ける行為は、重大なセキュリティリスクに直結します。また、会社が許可していないツールを使い続けることは、企業のコンプライアンスを揺るがす問題にもなり得ます。
こうした背景から、外部への通信を一切発生させない仕組みが求められます。ブラウザ上で動作するJavaScriptは、利用者のPC内だけで処理を完結させることが可能です。テキストボックスに入力されたデータを整形し、インデントを挿入して出力する工程において、サーバーへ送信する必要は本来ありません。
今回公開したツールの核心は、ブラウザ標準の機能を活用したシンプルな実装にあります。外部ライブラリに頼らず、誰もがコードの内容を検証できる透明性を確保しました。バックエンドへの送信処理が含まれていないことを容易に確認できるため、安全性が担保されます。
ツールとしての利便性も追求し、機能を絞り込むことで迷いのない操作感を実現しました。貼り付けた瞬間の整形はもちろん、構文エラーの即座な検知、そして無駄を削ぎ落としたことによる軽快な動作が特徴です。顧客情報が含まれる本番ログの調査や、複雑な構造を持つAPIのデバッグ、仕様書に載せるためのサンプル作成など、ビジネスの現場で直面する多様なシーンで活用できます。
便利なツールが溢れる現代だからこそ、エンジニアには道具の仕組みを把握する責任があります。利便性だけを優先して中身のわからないブラックボックスを使うのではなく、仕組みが明快で検証可能な手段を選ぶ姿勢が、堅牢なシステム運用を支える一歩となります。日々の業務を安全に進めるための標準的な道具として、この整形ツールを役立ててください。
セキュリティと実用性を両立したJSON整形ツール
2023/10/04
2023/09/19
【Bard】Golangは将来性はあるか?
Golangは、Googleが開発したオープンソースのプログラミング言語です。2009年にリリースされて以来、急速に人気が高まり、現在では世界中で多くの企業で採用されています。
Golangの将来性が期待される理由は、以下の3つが挙げられます。
パフォーマンスが優れている
Golangは、並列処理やメモリ管理に優れているため、高速かつ安定したアプリケーションを開発することができます。
学習コストが低い
Golangは、シンプルな文法と構文を採用しているため、他のプログラミング言語を習得している人であれば、比較的簡単に学習することができます。
幅広い用途に対応している
Golangは、Webアプリケーションやサーバーサイドアプリケーション、デスクトップアプリケーション、モバイルアプリケーションなど、さまざまな用途に使用することができます。
特に、今後ますます需要が高まると予想される、クラウドコンピューティングやIoTなどの分野で、Golangの需要は高まっていくと考えられます。
もちろん、Golangにも欠点はあります。例えば、オブジェクト指向の概念が弱い、例外処理がないなどの点が挙げられます。しかし、これらの欠点は、Golangのメリットを大きく上回るとは考えにくいでしょう。
以上のことから、Golangは今後も多くの企業で採用され、エンジニアの需要が高まっていくと予想されます。
具体的には、以下の分野でGolangの需要が高まっていくと考えられます。
クラウドコンピューティング
クラウドコンピューティングは、今後ますます普及していくと予想される分野です。Golangは、クラウドコンピューティングの基盤となるサーバーの開発に適した言語です。
IoT
IoTは、さまざまなデバイスをネットワークで接続する技術です。Golangは、IoTデバイスの開発に適した言語です。
機械学習
機械学習は、人工知能の分野で重要な技術です。Golangは、機械学習のフレームワークと組み合わせて使用することで、効率的に機械学習モデルを開発することができます。
このように、Golangはさまざまな分野で活躍できる言語であり、将来性も十分にあると言えます。
2023/09/15
【Bird】エラーコード「2153-0321」が表示された場合の対処方法
- 電源を切って、ACアダプターやケーブルを再接続する。
- 本体を再起動する。
- データを初期化する。
- Nintendoサポートに問い合わせて、本体の修理を依頼する。
2023/09/14
Apple iPhone 15発表会
Apple iPhone 15発表会
今回は4種類
- iPhone 15 Pro Max
- iPhone 15 Pro
- iPhone 15 Plus
- iPhone 15
みたいなのがなくなってる気がします。
確かに性能は上がっていますが、既定路線過ぎて驚く要素があまりない。
最初の頃は、夜中リアルタイムで発表会を観ていたけど、
ここ何年かは、普通に朝まとめサイトみてるだけになっている。
自分の情熱が減っただけなのかな。
皆さんはどうでしょうか?
2023/09/05
【SwiftUI】@Stateとか@Bindingとかなんなのさ。
SwiftUIでは、アプリケーションの状態管理やデータバインディングなどの機能を提供するために、いくつかのプロパティラッパーが用意されています。
`@State`と`@Binding`はそのうちの2つの重要なプロパティラッパーです。
`@State`は、プロパティを変更可能な状態(State)として宣言するために使用します。
SwiftUIビュー内のプロパティを`@State`で宣言すると、そのプロパティの変更がビューに影響を与え、ビューが自動的に再描画されるようになります。
@State`は、ビュー内で単一の値の状態を管理するために使用されます。
struct ContentView: View {
@State private var count = 0
var body: some View {
Text("Count: \(count)")
Button("Increment") {
count += 1 // @Stateプロパティの変更
}
}
}
2. `@Binding`:`@Binding`は、プロパティを他のビューから参照し、変更できるようにするために使用されます。
`@Binding`を使用すると、値を保持するビューとその値を表示または変更する別のビュー間でデータを共有できます。
struct DetailView: View {
@Binding var count: Int
var body: some View {
Text("Count in Detail: \(count)")
}
}
これらのプロパティラッパーは、SwiftUIアプリケーション内でデータの管理と共有を効果的に行うために使用されます。
`@State`はローカルな状態の管理に適しており、`@Binding`は異なるビュー間でデータを双方向に共有するのに適しています。
2023/08/31
Sample of reading XML file with python
import xml.etree.ElementTree as ET
# Load the XML file
tree = ET.parse('data.xml')
root = tree.getroot()
# Iterate through 'person' elements and extract data
for person in root.findall('person'):
name = person.find('name').text
age = person.find('age').text
print(f"Name: {name}, Age: {age}")
2023/07/25
Sample of reading CSV file with python
Name,Age Alice,25 Bob,30 Charlie,22
import csv
def read_csv_file(file_path):
try:
with open(file_path, 'r', newline='') as csvfile:
csv_reader = csv.DictReader(csvfile)
# 各行のデータを利用
for row in csv_reader:
name = row['Name']
age = int(row['Age'])
print(f"{name} is {age} years old.")
except FileNotFoundError:
print("File not found.")
except Exception as e:
print("Error:", e)
if __name__ == "__main__":
csv_file_path = "example.csv" # CSVファイルのパスを指定してください
read_csv_file(csv_file_path)
python で authorization header bearer token 方式のサンプル
import requests
def main():
# 送信先のURL
url = "https://example.com/api/endpoint"
# Bearerトークン
bearer_token = "your_bearer_token_here"
# 送信するJSONデータ
data = {
"key1": "value1",
"key2": "value2"
}
# POSTリクエストを送信
response = requests.post(url, json=data, headers={"Authorization": "Bearer " + bearer_token})
# レスポンスの内容を表示
if response.status_code == 200:
print("Success!")
print("Response:", response.json())
else:
print("Error:", response.status_code, response.text)
if __name__ == "__main__":
main()
Go言語によるBearer認証の実装サンプル
Go言語で実現するBearerトークン認証
モダンなWeb API開発において、セキュリティを確保するための認証方式として「Bearerトークン(主にJWTなど)」は事実上の標準となっています。
Go言語の標準ライブラリ net/http を用いて、この認証ヘッダーを正しく、かつ安全に実装する方法を詳しく解説します。
1. 実装サンプルコード
以下のコードは、JSONデータをPOSTしつつ、AuthorizationヘッダーにBearerトークンを付与する完結したサンプルです。 エラーハンドリングやタイムアウト設定など、実務で必須となる要素を盛り込んでいます。
package main
import (
"bytes"
"fmt"
"io"
"net/http"
"time"
)
func main() {
// 接続先URLと認証トークンの定義
const (
apiURL = "https://example.com/api/v1/resource"
bearerToken = "your_secret_access_token"
)
// 送信するペイロード(JSON)の構築
payload := []byte(`{"name": "Gopher", "role": "Developer"}`)
// 1. リクエストオブジェクトの生成
// http.Post() 等の簡易メソッドではヘッダーの個別設定ができないため、NewRequestを使用します
req, err := http.NewRequest(http.MethodPost, apiURL, bytes.NewBuffer(payload))
if err != nil {
fmt.Printf("リクエストの作成に失敗しました: %v\n", err)
return
}
// 2. 必須ヘッダーの設定
// Bearerの後には必ず半角スペースが必要です
req.Header.Set("Authorization", "Bearer "+bearerToken)
req.Header.Set("Content-Type", "application/json")
// 3. HTTPクライアントの実行
// http.DefaultClient はタイムアウトが設定されていないため、独自のClient定義を強く推奨します
client := &http.Client{
Timeout: 10 * time.Second,
}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("通信エラーが発生しました: %v\n", err)
return
}
// リソースリークを防ぐため、必ずCloseを呼び出す
defer resp.Body.Close()
// 4. 結果の読み取りと判定
body, _ := io.ReadAll(resp.Body)
if resp.StatusCode == http.StatusOK {
fmt.Printf("成功: %s\n", string(body))
} else {
fmt.Printf("サーバーエラー: %d - %s\n", resp.StatusCode, string(body))
}
}
2. 実装上の重要なTips
なぜ http.NewRequest を使うのか?
http.Get や http.Post は内部でデフォルトのクライアントを使用しており、独自のヘッダーを追加する機能がありません。
認証が必要なAPIを叩く場合は、http.NewRequest を使用してリクエストインスタンスを生成し、Header.Set で個別に制御するのが正しいアプローチです。
Bearerスキームの書式に注意
Authorizationヘッダーの値は Bearer <token> という形式で指定する必要があります。
この Bearer とトークンの間の半角スペースを忘れると、サーバー側で正しくパースされず、401 Unauthorizedエラーの原因となります。
プロダクション環境での注意点
- タイムアウト: ネットワークの遅延やサーバーの無応答に備え、必ず
http.Clientにタイムアウトを設定してください。 - トークンの秘匿: トークンをコード内にハードコードせず、環境変数(
os.Getenv)やシークレット管理サービスから取得するようにしましょう。
Python Post Request with Json Example
import requests
import json
def main():
# 送信先のURL
url = "https://example.com/api/endpoint"
# 送信するJSONデータ
data = {
"key1": "value1",
"key2": "value2"
}
# JSONデータを文字列に変換
json_data = json.dumps(data)
# POSTリクエストを送信
response = requests.post(url, data=json_data, headers={"Content-Type": "application/json"})
# レスポンスの内容を表示
if response.status_code == 200:
print("Success!")
print("Response:", response.json())
else:
print("Error:", response.status_code, response.text)
if __name__ == "__main__":
main()
golang でカタカナだけを抽出するサンプル
package main
import (
"fmt"
"regexp"
)
func main() {
// カタカナとひらがなを混ぜた文字列
originalString := "コンニチハセカイ こんにちはせかい"
// 文字列からカタカナのみを抽出
katakanaString := extractKatakana(originalString)
// カタカナのみの文字列を出力
fmt.Println("Katakana String:", katakanaString)
}
// カタカナのみを抽出する関数
func extractKatakana(s string) string {
// 正規表現パターンを定義
// カタカナ文字のUnicode範囲: U+30A0 ~ U+30FF
regexPattern := "[ァ-ヿ]+"
// 正規表現にマッチする部分を抽出
regExp := regexp.MustCompile(regexPattern)
katakanaSlice := regExp.FindAllString(s, -1)
// カタカナの文字列に変換
katakanaString := ""
for _, kana := range katakanaSlice {
katakanaString += kana
}
return katakanaString
}
golang のJson をPostするサンプル
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
// The URL to which you want to send the JSON data
url := "https://example.com/api/endpoint"
// Data to be sent as JSON in the request body
data := map[string]interface{}{
"key1": "value1",
"key2": "value2",
}
// Convert data to JSON format
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Println("Error converting data to JSON:", err)
return
}
// Create a new HTTP request
request, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
fmt.Println("Error creating request:", err)
return
}
// Set the request header to indicate JSON data
request.Header.Set("Content-Type", "application/json")
// Create an HTTP client and send the request
client := &http.Client{}
response, err := client.Do(request)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer response.Body.Close()
// Check the response status code
if response.StatusCode != http.StatusOK {
fmt.Println("Unexpected response status code:", response.StatusCode)
return
}
// Read the response body
var responseData map[string]interface{}
err = json.NewDecoder(response.Body).Decode(&responseData)
if err != nil {
fmt.Println("Error decoding response:", err)
return
}
// Process the response data as needed
fmt.Println("Response:", responseData)
}
2023/07/21
【Bird】 ポケモンスリープについて聞いてみた。
ポケモンスリープは、2023年7月17日にリリースされたスマートフォン向けゲームアプリです。本作は、スマートフォンもしくは「Pokémon GO Plus+」のセンサーを使ってユーザーの睡眠時間や睡眠の質を計測し、そのデータを使ったゲームを進めることで、楽しみながら睡眠リズムを整えるアプリです。
ゲームの開始時には、ユーザーは自分の睡眠データを入力します。このデータは、スマートフォンの画面をオフにして枕元に置いた「Pokémon GO Plus+」によって収集されます。収集されたデータは、ユーザーの睡眠時間、睡眠の深さ、睡眠の質、睡眠時の動きなどを分析します。
ゲームでは、ユーザーは「Pokémon GO Plus+」を枕元に置いて寝ると、カビゴンが登場します。カビゴンは、ユーザーの睡眠データに基づいて、眠り方や寝相を変化させます。ユーザーは、カビゴンの眠り方や寝相を観察して、自分の睡眠の質を改善することができます。
ゲームでは、ユーザーはカビゴンを育てることができます。カビゴンを育てるためには、ユーザーは睡眠をとる必要があります。睡眠をとると、カビゴンは成長し、新しい技を覚えます。カビゴンを強く育てるためには、ユーザーは質の高い睡眠をとることが大切です。
ポケモンスリープは、睡眠リズムを整えるゲームです。本作は、スマートフォンもしくは「Pokémon GO Plus+」のセンサーを使ってユーザーの睡眠データを収集し、そのデータをゲームに反映します。ユーザーは、ゲームをプレイすることで、自分の睡眠の質を改善することができます。
ポケモンスリープは、睡眠の質を改善したい人、カビゴンを育てたい人、ポケモンをもっと楽しみたい人におすすめのゲーム
2023/07/20
【Bird】君たちはどう生きるか ジブリの最新作をネタバレなしで観た感想を1000文字程度にまとめてくださいと聞いてみた。
birdにネタバレなしで感想を聞いてみました。
実際に観た方がこんな感じにおもっているのかなぁ?
----
2023年7月14日に公開されたスタジオジブリの最新作「君たちはどう生きるか」を観てきました。この映画は、生きることの意味について深く考えさせられる作品で、とても印象に残りました。
物語は、ある日、謎の人物から一冊の本をもらった少年・眞人(まこと)の視点から描かれます。その本は、生きることについて様々なことを教えてくれる本で、眞人は、その本を読んで、生きることについて考え始めます。
この映画では、生きることの意味について、様々な角度から考えさせられます。例えば、生きることの意味は何か?生きることの目的は何か?生きることの喜びとは何か?生きることの苦しみとは何か?生きることの美しさとは何か?生きることの悲しみとは何か?
この映画は、これらの問いに対して、一つの答えを出すことはありません。しかし、この映画は、生きることについて考えさせてくれるきっかけを与えてくれる作品です。
この映画を観た後、私は、生きることについて、改めて考えさせられました。生きることの意味は、人それぞれ違うと思います。しかし、生きることの意味は、何か一つに絞る必要はないと思います。生きることの意味は、様々なものから成り立っていると思います。
生きることの意味は、家族や友人との絆かもしれません。生きることの意味は、仕事や趣味かもしれません。生きることの意味は、自然や芸術かもしれません。生きることの意味は、夢や希望かもしれません。
生きることの意味は、人それぞれ違うと思います。しかし、生きることの意味は、何か一つに絞る必要はないと思います。生きることの意味は、様々なものから成り立っていると思います。
この映画は、生きることについて考えさせてくれるきっかけを与えてくれる作品です。この映画を観て、生きることについて、改めて考えてみてはいかがでしょうか。
2023/07/11
【Bard】ドコモのプランeximoとirumoの違いを表にまとめて
はい、ドコモのプランeximoとirumoの違いを以下にまとめました。
| 項目 | eximo | irumo |
|---|---|---|
| 月額料金 | 2,970円(税込) | 2,728円(税込) |
| データ容量 | 5GB | 3GB |
| 通話料 | 22円/30秒(国内) | 22円/30秒(国内) |
| かけ放題オプション | 1,100円/月(税込) | 550円/月(税込) |
| 5Gオプション | 550円/月(税込) | 無料 |
| 国際ローミング | 有料 | 有料 |
| ドコモ光セット割 | 最大1,100円/月(税込) | 最大1,050円/月(税込) |
| ドコモオンラインショップ割引 | 最大1,000円/月(税込) | 最大1,000円/月(税込) |
| 家族割引 | 最大2,200円/月(税込) | 最大2,200円/月(税込) |
2023/06/21
AWSメモです。
EC2編
- インスタンスはあとから、VPCの設定ができない。
- VPCが無い時代に作成されたインスタンスは、あとからVPCに移動できない。
- t1.microからt2.microにポチッと簡単に移行できない。
- t1.microからt2.microへ移行は、インスタンス作り直して、移行したほうが楽
- t1.microの起動ボタンは何度もトライすべし。(AWSが起動できる総数がだいぶ少なく設定してる)
- VPC内にELBを設定するしかできない。(昔はできた)
- cloudfrontに設定するSSL証明書はバージニア州じゃないとセットできない。
- 東京リージョンでSSL証明書作成しても、cloudfrontにはセットできない。
- ElasticIPはセットしていないと、金が取られる
Route53編
- 自動更新ONだとちょうど一ヶ月に自動更新される
- 意外と、更新費用が高い。
- .jpドメインだと、90ドル (他のところで買ったほうがやすい)
(ワード)
EC2-Classic
PV
HVM
2023/05/31
【Bard】2023/05/31に発生した東横線の日吉駅で発生した線路火災で2回も運転見合わせたニュース原稿を書いてもらえますか?
なんか、ちょっとずつ違うな。
---2回目
はい、喜んで。
東急線日吉駅で線路火災、運転見合わせが2回
2023年5月31日、神奈川県横浜市の東急線日吉駅で線路火災が発生し、東横線、目黒線、新横浜線の一部区間で運転見合わせとなりました。
火災は午前8時26分頃、日吉駅の線路内で発生しました。発煙に気づいた駅員が消防に通報し、消防車が出動して消火活動を行いました。火災は午前9時30分頃に鎮火しましたが、線路が損傷したため、東横線は武蔵小杉駅と菊名駅間、目黒線は武蔵小杉駅と日吉駅間、新横浜線は日吉駅と新横浜駅間で運転を見合わせとなりました。
東急電鉄は午前11時5分頃、東横線、目黒線、新横浜線の全線で運転を再開しましたが、午後12時30分頃、再び日吉駅の線路内で発煙が確認されました。このため、東横線、目黒線、新横浜線の全線で運転を見合わせとなりました。
東急電鉄は、運転再開の見通しを明らかにしていません。
この線路火災の影響で、多くの人が通勤や通学に遅れました。
--- 1回目
はい、喜んで。
東横線日吉駅で線路火災、2回運転見合わせ
2023年5月31日、午前8時26分頃、東横線日吉駅で線路火災が発生しました。火災は、線路の切り替えポイントで発生し、すぐに線路全体に広がりました。消防車が駆け付け、約2時間後に鎮火しましたが、線路は焼け焦げ、東横線は運休となりました。
この火災により、約1万人の乗客が影響を受けました。東横線は、午後2時頃に運転を再開しましたが、午後6時頃に再び線路火災が発生し、運転見合わせとなりました。
この火災により、約2万人の乗客が影響を受けました。東横線は、午後10時頃に運転を再開しましたが、復旧には数日かかると見られています。
この火災の原因は、現在のところ、調査中です。消防は、線路の不良や放火の可能性も含めて調べています。
東急電鉄は、再発防止策として、すべての線路の点検を実施するとしています。
---
【Bard】google Pixel7とgoogle Pixel6を比較し利用した感想を1000文字にまとめてください、と書いてもらった。
Google Pixel 7とGoogle Pixel 6は、どちらもGoogleが販売しているスマートフォンです。Pixel 7はPixel 6の次世代モデルであり、いくつかの点で改良されています。
Pixel 7とPixel 6の最も大きな違いは、プロセッサーです。Pixel 7には、Googleが独自開発した第2世代のTensor G2プロセッサーが搭載されています。Tensor G2は、Tensorプロセッサーよりも処理速度が向上しており、ゲームや動画編集などの負荷のかかる作業でも快適に使用することができます。
Pixel 7とPixel 6のもう1つの違いは、カメラです。Pixel 7には、Pixel 6と同じ50MPの広角カメラと12MPの超広角カメラが搭載されています。しかし、Pixel 7は、Pixel 6よりもボケ補正機能が強化されています。これにより、Pixel 7では、被写体と背景をより美しくぼかした写真を撮影することができます。
Pixel 7とPixel 6のバッテリー容量は、どちらも同じ4600mAhです。しかし、Pixel 7は、Tensor G2プロセッサーの省電力性能が向上しているため、Pixel 6よりもバッテリーの持ちが長くなっています。
Pixel 7は、Pixel 6のすべての機能を継承し、さらに改良されたスマートフォンです。特に、Tensor G2プロセッサーの処理能力の向上とボケ補正機能の強化は、大きな魅力と言えるでしょう。Pixel 7は、ゲームや動画編集を頻繁に行う人や、美しい写真を撮りたい人に最適なスマートフォンです。
私もPixel 7をしばらく使用していますが、その性能には大変満足しています。Tensor G2プロセッサーのおかげで、ゲームや動画編集をしても動作が非常に快適です。また、ボケ補正機能も非常に優秀で、被写体と背景を美しくぼかした写真を簡単に撮影することができます。Pixel 7は、間違いなく今最もおすすめのスマートフォンです。