「JSON」を含む日記 RSS

はてなキーワード: JSONとは

2024-07-16

[] 設定は外部化

たまに設定を引数で全部与えるようにしている人がいるが、それだけでは対応力がない

技術畑の外側の人にも設定できるようにするぐらいでないと

で、その方法が「外部化」ね

要は、設定できるあらゆる項目は、わかりやすく簡易化した上で、jsonで保存できるようにする

こうしておけば、例えばセールス業務人間が「こういう広告設定をしたい」といってjsonへ設定できるようになる

ただし、設定内容が正しいかどうかを簡単にチェックする機構をつけるともっといい

2024-06-24

elasticsearchをデータストアとして使うのをやめろ

なんで巷のアホ達はelasticsearchをRDBの上位バージョンだと思ってしまうのか。

ただのjson突っ込める検索エンジンなのに。

elasticsearchへ大切なデータを入れるな。トランザクションは大切だからRDBに入れろ。

elasticsearchで積極的joinを使うな。joinRDBでやれ

elasticsearchをデータマスターとして更新かけるな。RDB管理して必要に応じてelasticsearchへ更新をかけろ

大切なデータRDBに入れて、複雑な検索だけelasticsearchへ投げろ

ただの検索エンジンとして使え

2024-05-24

anond:20240523100428

ダブスタ検証用のスクリプト簡単に書いたよ(AIで)

import requests
import json
from urllib.parse import quote

def fetch_bookmarks(url):
    try:
        # URLエスケープ
        escaped_url = quote(url, safe="")
        api_url = f"https://b.hatena.ne.jp/entry/json/?url={escaped_url}"

        response = requests.get(api_url)
        response.raise_for_status()

        try:
            return response.json()
        except json.decoder.JSONDecodeError as e:
            print(f"Error decoding JSON from {api_url}: {e}")
            print("Response content:", response.text)
            return []
    except requests.exceptions.RequestException as e:
        print(f"Error fetching bookmarks from {api_url}: {e}")
        return []

def find_common_bookmarks(bookmarks1, bookmarks2, url1, url2):
    common_users = set(bm["user"] for bm in bookmarks1 if bm["comment"]) & set(bm["user"] for bm in bookmarks2 if bm["comment"])
    common_bookmarks = []
    for user in common_users:
        comments = []
        for bm in bookmarks1:
            if bm["user"] == user and bm["comment"]:
                comments.append({"url": url1, "comment": bm["comment"], "timestamp": bm["timestamp"]})
                break
        for bm in bookmarks2:
            if bm["user"] == user and bm["comment"]:
                comments.append({"url": url2, "comment": bm["comment"], "timestamp": bm["timestamp"]})
                break
        if len(comments) == 2:
            common_bookmarks.append({"user": user, "comments": comments})
    return common_bookmarks

if __name__ == "__main__":
    url1 = "https://news.yahoo.co.jp/articles/f9966c4ccc374fc88babbb50175a9ea844c99638"
    url2 = "https://www.asahi.com/articles/ASN6K7F64N6KUJHB00L.html"

    data1 = fetch_bookmarks(url1)
    data2 = fetch_bookmarks(url2)

    common_bookmarks = find_common_bookmarks(data1["bookmarks"], data2["bookmarks"], url1, url2)

    print(json.dumps(common_bookmarks, indent=2, ensure_ascii=False))

url1, url2のところを対象としたいものに変えれば使えるよ

抽出対象となるのは以下のユーザーだよ

バグあったら直して使ってね

※てかはてな匿名ってシンタックスハイライト記法使えないんだね、使って表示確認したら500エラーになったわ

2024-05-16

JWT

JSON自体頭文字後だからJSON Web Tokenの頭文字語はJSONWTになりそうなものだが、実際にはJWT。

世間ではJavaScriptJavaと略すなとよく聞くけど、JWTはScriptが消えてしまってJavaになってる。

2024-05-15

anond:20240515152104

たった今、GPT(といってもBingのCopilotだけど)を使ったところだわ

AWS上でJavaScriptを動かしてて、AWSライブラリ固有のエラーが出たんで

エラーメッセージをそのまま「これって何なの?」と聞いた

Amazon Qに聞いた方がよかったんかなw

でもブラウザで直接Copilotに聞けるから、こっちの方が便利なんよね。。

あとパッと思いつくとこだと、テストデータが欲しいか都道府県県庁所在地データくれ、とか

それをJSON形式にしてくれ、とか色々便利に使わせてもらってる

2024-05-06

[] 2024-05-06

今日入院している祖母に会いに行く日だ。入院前はもう呆けて風呂も入らないぐらいひどい状態だったが、入院してからちゃんとしているらしい。

それはそうと、lisppython環境を構築する話だが、結局オートコンプリートはうざいし、使う機能といったらautopep8とisortぐらいなので、以下を.emacsに組み込んだ。

(defun python-autopep8-and-isort ()
  "Run autopep8 and isort on current Python buffer."
  (interactive)
  (when (eq major-mode 'python-mode)
    (shell-command-on-region (point-min) (point-max)
                             "autopep8 - | isort -" nil t)))

(with-eval-after-load 'python
  (define-key python-mode-map (kbd "C-c C-r") 'python-autopep8-and-isort))

.emacsファイルには他にも様々な設定を付与したが、ここではコードを書ききれない。

さてそういうわけで週末コーディング趣味としてちゃん機能することはわかったが、毎週作るとなると、いくつも何かを作るよりは一つのタフなものを作りたいと思うわけである

それで、最有力候補は「Elasticsearchのようなものpython実装する」という話がある。

Elasticsearchが徹底された設定外部化によってjsonを多用するのだが、これがあまり柔軟性がないので、コードを直にいじれるようにしたいと思ったためである

例えば自作日本語トーカナイザを組み込みたいときElasticsearchプラグインJavaで書かなければならない。私はJavaが嫌いであり、プラグインを「インストールする」という手順も冗長に感じる。

それよりはpythonで作られた検索システムに、適当トーカナイズ関数実装して呼び出すことができればかなり柔軟であるように思うわけである

難しい点があるとすれば、大規模分散システムへの対応で、金をかけなければそういうシステムテストすることができない。

できるだけ金をかけずに趣味をやるというのがモットーなので、これではまずいわけである

まあ何事も困難というものはある。まずは手を動かすことが重要だ。Linus Torvaldsも"Talk is cheap, show me the code"と言っているではないか

2024-04-14

anond:20240414001527

一番恥ずかしいのは「謎の半導体メーカー」「jsonという不気味な拡張子」あたり

2024-03-30

1週間前に再起不能になったEdgeを、今日復旧させた

問題の再発に備えて書いた日記備忘録

ブログIT技術者向けSNS等は利用しておらず、はてブTwitterでやるにはやや長いので、増田投稿

発端

Windows 10 (22H2 19045.4170) 上のEdgeを、数十のタブを開いたまま新バージョン (123.0.2420.53) に更新したらハングアップしたため、タスクマネージャー強制終了させた

その後Edgeを起動させようとすると、更新時に閉じたセッションを復帰させる段階で強制終了するようになり、使用不能になった

Edgeに導入していた拡張機能には、Session Budy (4.0.2。GoogleのManifest V3対応するため、最近大規模改修を実施(1。増田の最終節の同番号を参照。以下同)) やuBlock Origin (1.56.0。新規のマイフィルターを多数追加中だった) 等があった

最初の試み

Edgeが起動しない」と直截な語句検索していくつかの解説ページにたどり着いた

いくつかの解決策(2・3)を実行したところ、有効ではなかったが次の知見が得られた


数日程度では修復できないだろうと判断し、別のChromiumブラウザを使いつつ、片手間で修復方法を調べることにした

Windowsの設定画面等にあるリンク有効になるよう、デフォルトwebブラウザEdgeから変更した

パスワードは別ツール管理してたため無くてもそんなに困らなかったが、uBlockの設定とSession Budyで雑に保存してた閲覧履歴必要だったので、Chrome拡張の復旧作業をした

"Default\Local Extension Settings"以下のフォルダと、念のために"Default\IndexedDB""Default\Local Storage\leveldb"の中身を移植(8)して作業完了

翌日以降

アイテム履歴データ破損が問題の原因ではと考えてその修復や初期化方法検索したが、これは徒労に終わった(ただし、このアプローチが完全に無効だとは言い切れない。参考ページ5は、復旧作業完了後に見つけた情報で、今回の問題活用できずに終わった)

Edge挙動を変更した(9・10)が、これも無駄だった

コントロールパネルシステムセキュリティセキュリティメンテナンス信頼性履歴の表示→問題レポートをすべて表示」で確認できた、Edge問題の要約やイベント名等で検索したところ、再インストールを勧めるページが数点引っかかった

既に何日も経ちWindowsの再インストールユーザーアカウントの作り直しをしようかと考えかけていたが、もう少し努力してみることにした

結末

Edgeを (アプリファイルを手動で削除したりするのではなく) なるべく安全アンインストールすれば、正常に再インストールできるのではと考え、検索結果通り(1112)に作業してみた

それでも「アプリ」のアンインストールメニュー無効なままで操作できなかったが、他に事例が無いか、"IntegratedServicesRegionPolicySet.json"等の関連語句で再検索した

コマンドラインアンインストールを試みた事例(13)が見つかり、実行したらEdgeが削除された (ただし、コマンドプロンプトでもポップアップウィンドウでも実行結果の表示がされなかった)

そして参考ページ4のインストーラを実行し、念のために修復とOS再起動をかけ、Edgeの起動を確認した

Microsoftアカウントログインしていたため、パスワード簡単に復旧できた

拡張機能は全て死んでいたが、仮に使っていたChromiumブラウザからコピペしたりエクスポートしたりして終了

利用していた拡張が少なかったので、プロファイルフォルダの内容の移植よりもその方が簡単だった

参考ページ

1. SESSION BUDDY V3 END OF LIFE | Google グループ

https://groups.google.com/g/sessionbuddy-discuss/c/HQPcLOq3-Ik

2. Microsoft Edgeが直ぐ閉じてしまう。 | Microsoft コミュニティ

https://answers.microsoft.com/ja-jp/microsoftedge/forum/all/microsoft/c414d2f9-b685-471c-8e78-2054c2e26c6c

3. ある日突然「Microsoft Edge」が開かなくなった、さあどうしましょう:山市良のうぃんどうず日記(224) | @IT

https://atmarkit.itmedia.co.jp/ait/articles/2202/02/news009.html

4. Microsoft Edgeダウンロード

https://www.microsoft.com/ja-jp/edge/download?form=MA13FJ

5. Windows10の「タスクバーにピン留めしているアプリ」の、「最近使ったもの」と「固定済み(いつも表示)」の設定ファイルレジストリはここにある #Windows10 | Qiita

https://qiita.com/RyoIchimura/items/7e33980358f07e57a715

6. msconfigシステム構成)で解除してよいのは?使用場面と起動方法 | ドスパラ通販公式

https://www.dospara.co.jp/5info/cts_str_pc_msconfig.html

7. Windows Hello概要セットアップ | Microsoft サポート

https://support.microsoft.com/ja-jp/windows/windows-hello-%E3%81%AE%E6%A6%82%E8%A6%81%E3%81%A8%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97-dae28983-8242-bb2a-d3d1-87c9d265a5f0

8. chrome.storageの実体場所 #Chrome | Qiita

https://qiita.com/k7a/items/cf644471d34d31f398e9

9. 第2回 グループポリシーとは何か:グループポリシーのしくみ(3/5 ページ) | @IT

https://atmarkit.itmedia.co.jp/ait/articles/0602/23/news119_3.html

10. Microsoft Edge ブラウザポリシーに関するドキュメント | Microsoft Learn

https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies

11. Windows 11/10からMicrosoft Edgeアンインストールするシンプル方法が見つかる | ソフトアンテナ

https://softantenna.com/blog/windows-11-10-uninstall-edge/

12. Releases · thebookisclosed/ViVe | GitHub

https://github.com/thebookisclosed/ViVe/releases

13. 各チャネルごとの Edge 削除状況 | 内気なもんた君

https://coolvitto.hateblo.jp/entry/2023/12/17/231027

2024-03-15

id:xlc さんがちょっと心配

・嫌いなもの記事自分から突っ込んで行って嫌いと言う

・(類似製品の)好きなもの記事に行って嫌いなものの苦言を言う


自分から嫌いと言いに行くのはもうアレな人の手前なんよ…

それが嫌いなら開かず無視したらええねん…ひたすら腐してるのはなんなん…

あなたが望む実現しない要件を何度も挙げて最低条件って言うのは客観的に見て結構恥ずかしくないですか?他のみんなは大多数が興味があって覗いて、少数は内容を批判的に論じるんだけどxlc さんのは内容関係ないよね…?

超バズったからやってきた。とかならわかるんだけど公開ブクマ1桁以内でこういうの言っちゃったりしてるのは当たり屋じゃないっすかね…

ちょっと心を落ち着けはいかが?


なぜコーディングVSCodeを使うのか。 私がVSCodeを選んだ理由

xlc 2024-03-13

全く心が動かない。私的には80カラム固定のペインが2つ開きっぱなしの状態が維持できて複数プロジェクトが同時に開けるのが最低条件。


Atom の作者達が作った Rust 製エディタ Zed (OSS) - Qiita

xlc 2024-02-25

VS Codeが嫌すぎてAtomを使い続けているので同じ使い勝手なら移行を考えるかも。私的には80カラム固定のペインが2つ開きっぱなしの状態が維持できて複数プロジェクトが同時に開けるのが最低条件。


保守理解やすコードを書きたい! 〜VSCode拡張機能で循環的複雑度と戦う〜 - Qiita

xlc 2024-02-23

Atomの開発が終了しVSCodeインストールした2023年は全くコードを書かない一年となった。それぐらい使いにくい。というか使う気にならんのだがみんなよく使ってるね。今年Atomに戻したらプログラミングを再開できた。


VS Codeの新機能がすごく便利! ツリービューのスティッキースクロール機能をオンにすると格段に使いやすくなります

xlc 2024-02-15

昨年ほとんどプログラムを書かなかったのはVS Codeさわりたくなかったから。とうとう諦めてAtomに戻してプログラミングの習慣を取り戻しました。後継エディタにもがんばってほしい。


書籍を書きました。 そう、VS Codeで。

xlc 2023-02-02

私はこれ https://www.amazon.co.jp/dp/4798067881 を書くのにこれ https://kobalab.net/liulian/ を使いました。


VScodeの設定(setting.json)まとめ【2023年1月更新

xlc 2023-01-02

VScodeがあまりにも使いにくいので未だにAtomを使ってる。


GitHubコードエディター「Atom」の最終版が公開 ~8年間の開発に終止符/12月15日をもってリポジトリアーカイブ

xlc 2022-11-22

VS Codeを起動してみたが、そっと閉じ、使えるうちはAtomを使い続けようと決意した。


Sunsetting Atom | The GitHub Blog

xlc 2022-06-09

まじか。毎日使ってるのに。VS Codeに乗り換えんとならんのか。やだなあ。

2024-02-29

honkitつかいこなせた!

べつにおどろくことでもなんでもないけど、honkitできた!

HP作成ツールなのね?

Node.jsがらみのツールらしい。これってのもはじめての経験だ。Node.jsとはjsの開発環境のこと?なんじゃ?IDE

ディレクトリーに適当マークダウンファイルjsonファイルをおいておけば、HP作成してくれた。htmlタグベタ打ちするのも、いやだった。だからよかった。

さいきん、ベタ打ちすることないし、といっていちいちpandocとかで変換するのもめんどうだし・・・よかった。

いまのところ、git repoでもなんでもないフォルダーマークダウンファイルなどをおいて、honkitでウェブファイル作成してから

そいつエイヤーっとgit repoに動かして、git pushリモートにもっていって、さらgithub pagesHPにしているけど・・これって

もしかして・・・git repoのなかにマークダウンたちを置けないか

2024-02-03

本日趣味プログラミング

第5回 Rollup のWASM buildを利用できるようにする

自分で書いてて意味が分からない。

第4回の続き。

エラーの指示通り?に次のコマンドでrollup/wasm-nodeのなるものインストールしたハズだが状況が変わらない。

npm i @rollup/wasm-node

切り分けのために、使われないハズの「node_modules/rollup」を削除してみる。

rm -r node_modules/rollup/

もう一回、チュートリアルの指示通りにコマンドを打つとエラーの様子が変わった。

npm run dev
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'rollup' imported from ****

まりインストールしたrollup/wasm-nodeは無視されてるらしい。なんでだ。

色々しらべてpackage.jsonを弄る必要があると気付く。参考にしたやつThanks silvenon

以下の文言を追加

"overrides": {
  "rollup": "npm:@rollup/wasm-node"
}

その後、再度「npm run dev」を実行。エラーの代わり、いくつか処理がされた後「・・・・・Killed」と出る。

もう嫌だ。飽きた。

が、ダメもとでブラウザアクセスするとLaravel Breezeの画面がブラウザで開けるようになっていた。

ただし、レイアウトがぐちゃぐちゃ。Killされた影響だろう。サインアップもできたのでもう良しとする。

2024-01-31

本日趣味プログラミング

第2回 Larabelチュートリアルを参考にログインするだけのWebアプリケーション(?)を作る

第1回で終わらなかったことを褒めて欲しい。

プロジェクト作成

composer create-project laravel/laravel example-app_20240131

index.phpアクセスできることを確認

続いて、Composerを使用してLaravel Breezeインストール

composer require laravel/breeze --dev

breeze:install Artisanコマンドを実行

php artisan breeze:install

いろいろ聞かれる。わからん。とりあえずBlade/Yes/PHPUnitを選択

すると「・・・・installed successfully.」と表示されたので何かが成功したっぽい。

続いて

php artisan migrate

するとエラー

Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] Connection refused 

そもそもデータベースの準備を何もしてなかったので、エラーが出るのは当たり前だった。

サンプル用にデータベース作成し、それに合わせて.envファイル修正する。

再度、

php artisan migrate

すると「DONE」と表示。成功したっぽい

チュートリアルに従い、「ウェブブラウザアプリケーションの/loginか/register URLアクセス」。

すると、Laravelが出してるっぽいエラー

Illuminate \ Foundation \ ViteManifestNotFoundException
PHP 8.1.27
10.43.0
Vite manifest not found at: /******/example-app_20240131/public/build/manifest.json
Run npm run dev in your terminal and refresh the page.

npmとやらが「not found」だったので手順を飛ばしたのがやはりダメだった。

さくらインターネットでnpmを使うにはnode.jsインストールしてnpmをコンパイルする必要がある?

はい、もう無理。飽きたので今日はここまで。

次回があれば「さくらインターネットスタンダードプラン環境にnpmをインストールする」である

早くHello Worldとか書きたい。

anond:20240131143125

そのアプローチは非常に効果的ですね。メイン関数内での処理をシンプルに保つことで、コードの可読性と保守性が向上します。以下にその考え方を反映したサンプルコードを示します。

import json

# ビジネスロジック関数
def business_logic(data):
    # ビジネスロジックの詳細
    pass

# 設定情報ロード
def load_config(config_file):
    with open(config_file, 'r') as f:
        config = json.load(f)
    return config

def main():
    # 設定情報ロード
    config = load_config('config.json')

    # ビジネスロジックの実行
    business_logic(config)

if __name__ == "__main__":
    main()

このコードでは、メイン関数は設定情報ロードし、その情報を元にビジネスロジックを実行するだけです。技術的な詳細は関数内にカプセル化されており、メイン関数はそれらの関数を呼び出すだけです。これにより、コード自然言語を読むような形で読むことができ、技術的詳細は隠蔽されます。また、各関数担当者も明確になります。このような設計は、大規模なプロジェクトやチームでの開発に特に有効です。

[]メイン関数の書き方

メイン関数では主要な処理をざっと実行する。このときに、以下を気をつけると保守性が高くなる。

こうすると、自然言語を読むような形でコードを読めるようになり、技術的詳細は隠蔽するので、担当者をわかりやすく分離することができる。

2024-01-22

ブコメダブスタをチェックするためのスクリプト適当Pythonで書いた

エラーハンドリングは省略。標準ライブラリのみで動く。

import json
import urllib.request


# True にするとユーザー名を隠す
hide_user = False
# 以下を書き換える。sys.argv 使ってもいいんだけど
url1 = "https://www.cygames.co.jp/news/id-23172/"
url2 = "https://mtg60.com/archives/palworlddoujinsi.html"


def get_bookmarks(url: str):
    req = urllib.request.Request(f"https://b.hatena.ne.jp/entry/json/{url}")
    with urllib.request.urlopen(req) as res:
        dict = json.loads(res.read())

    user_comments = {}

    for bookmark in dict["bookmarks"]:
        if bookmark["comment"]:
            user_comments[bookmark["user"]] = bookmark["comment"]

    return user_comments


b1 = get_bookmarks(url1)
b2 = get_bookmarks(url2)

common = set(b1.keys()).intersection(b2.keys())

print(f"[1] {url1}")
print(f"[2] {url2}")
print()

for user in sorted(common):
    if hide_user:
        print(user[0] + "*" * (len(user) - 1))
    else:
        print(user)
    print(f"[1] {b1[user]}")
    print(f"[2] {b2[user]}")
    print()

[] phpコードベースを綺麗に保つ

php場合、<?php 処理 という具合に書くが、この中身にはhtmljavascript包含することができてしま

MVCフレームワークを使わないにしろ基本的にビューとバックエンド処理は分割しておくべき。

さらDB処理、ビジネスロジックプログラム処理と言ったものがあるが、

DB処理はdbhandler専用のモジュールに分けておき、さらにそのモジュールを処理するテーブルごとに分けておいた方が良い(MVCではモデルと言う)

特にビジネスロジックプログラム処理の区別だが、「商品名アダルト商品と思わしき文字列があった場合登録拒否する」という例外は「ビジネス例外であるのに対し、「商品名文字列DBで用意されたvarcharの可変文字範囲を超えた」という例外は「技術例外であるということを明確に区別するようにコードを書く。

おすすめ機能」のような凝ったアルゴリズム必要場合はそれ専用のクラスへ分離しておくこと。

あと外部化可能な設定情報jsonで分離するようにしておいた方が良い。

2024-01-16

都道府県コードってのはまあ、普通に JIS X 0401 で定められてて

普通に公開されてるんで、普通に簡単調査することができる。

そんでこれの JSON形式が欲しい場合は、ちょっと前までなら

まぁこれくらいなら手動で頑張るかーとか、スクリプトを書き捨てる感じだったんだが。

今や、Bing先生にお願いしたらやってくれるんだもん。

いい時代になったわ。

2023-12-17

anond:20231216154938

コードの重複があるわけでもない状況で、コード関数ごとに分離するメリットデメリットを知りたいという話ですよね。

コードの重複がある場合関数などに切り分けていないと、同じコードを何度も書くことになり、不具合があった時にコピーされたすべての個所に変更が必要となるというデメリットがあるので理由がわかりやすいですが、重複が無いとその点が不明確ですね。

画面に収まらないサイズコード複数関数に分割するのが一般的だとは思います

理由元増田も書かれている通り、長いと理解の限度を超えるからです。

コード意味があるまとまりで短ければ短いほど理解がしやすいと思います

グローバル変数を使わないようにすると、入力・出力が関数を読むだけで明確にわかるので、さら理解がしやすいです。

また、関数に分けておけば、関数仕様通りに動くかの確認するユニットテスト簡単に書けます

ユニットテストでは関数さらにほかの関数を呼び出している場合、呼び出される関数の代わりにテストダブルを用意することもあります

分割して、複数関数を呼び出すようにすることのデメリットは、

下手糞が切り分けるとなんでそういう切り分けになったかからないところで切り分けられてかえって可読性が損なわれるとか、

関数機能拡張してより多く・あるいは少なくの情報必要な時に関数インタフェースの変更が必要になることとか、

関数を置いているファイル内の場所を変えたときバージョン管理システムが追っかけてくれないことがあるとか

くらいでしょうか。

いずれにせよ、分割するメリットの方がデメリットを上回ることが大半なので、大抵は機能ごとに分割して小さい関数を作り、それをメインからは呼ぶようにすると思います

以下、お悩みポイントに答えます

一番はメイン/サブ関数間で右往左往するので今やってる工程が何なのかがよくわからん

まず、関数名前をやっている工程を表すものにすることですね。

データの取り込み」 とか 「データ突合せ」とかを明示すると、それを呼んでいるということはそういうことをしてくれると思うので。

また、関数が何をしてくれるのかも関数コメントとしてつけておくとよいと思います

例えば、

filename引数指定されたファイルからデータを取り込み、JSONフォーマットで返す

引数: filename

返値: JSONフォーマットされた取り込まれデータ。例: [{'employee name': '山田 太郎', 'employee id': 1}]

例外: filenameを開けない場合はFileOpenError、JSONコンバートできなかった場合はConvertError

みたいなコメントをつけておくと何をする関数なのかわかるので、その機能を調べたいとき以外は読まないでいいかなと。

あと、コード連続で読みたい場合ソースを解析してタグジャンプをつけてくれるツールやらIDEやらを使うことが普通だと思います

あとは関数ごとに変数をいちいち定義し直すのがだるいみたいなのもありますね。

これはどういう意味でしょうか?同じものを表すのに関数ごとに別の変数名を付けているとか?

もしそうだとしたら、使っているプログラミング言語の制約やプログラミング規約によるものなのでしょうか?

ある関数ローカル変数が他の関数ローカル変数に影響を与えることは無いはずなので、ローカル変数は大抵適当名前が付けられるイメージです。

今時のプログラミング言語なら変数スコープ関数の中にとどまるような書き方ができると思うのですが。

関数インタフェース定義し、そこにいちいち引数を書くのが面倒というなら...まあ、それは必要税って感じがします。

そこに引数を書いておくことでこの関数が何に影響されるのかわかるので。

参考までに。

2023-11-29

過去イチでヤバイPJを引き継いだ

弊社のビジネス創造部門的なところが作ったPJがあるんだが

どうもゴリゴリ炎上してるらしくて支援に入った

こういう仕事は割とあるんだがなかなかのヤバさだったので紹介したい

ちなみにサービスの内容は非常に良くてユーザーも万単位で付いているらしい

からこそ炎上している

バックエンド環境

バックエンドAWS EC2動作しているがログインアカウント共通化されていてパスワードを全員で共有している

ユーザーを追加しようとしたら「そのような勝手行為セキュリティ許可されていません」とのこと

本番環境とStagingはインスタンスが分かれているが運用は同じ方法

Staging上で5人ぐらいが作業しているが、ホームの下にそれぞれのユーザー自分名前ディレクトリを作って作業している

バックエンドシステム

バックエンド側のシステムは詳細は伏せるが、某システムで動いている

仮にNode.js系だとすると、package.jsonがあってnpm run installでインストールするのだが、普通にインストールしようとするとエラーになる

内容は依存関係で失敗しているのだが、本番も同じソース動作している

動作させるにはnode_modulesをまるっとコピーして、とのこと

さっきの自分名前ディレクトリ配下コピーしてきて、適当ポート番号でサーバを立ち上げれば一応は動く

このため、新しいモジュールを入れようとすると依存関係で失敗するため、便利なモジュールがあってもインストールできないし

セキュリティアップデートも当てることはできない(現にバージョンがすごく古い)

バックエンドシステム内容

ソースコードGitHub管理されているがセーブポイント感覚でcommitされているのでコミットログを見ても何が起きているのかさっぱり分からない

おまけにPRも使わずmainマージしまくっていてわけがからない

加えてソースコードコメントアウトの嵐でどこに何が書いてあるのかさっぱりわからない

データベースPostgreSQLだが山ほどテーブルがあるのに外部キー依存は入っていないしVIEWも作られていない

まぁ、他にもテーブルを見ていくとアンチパターンオンパレードで、EAV、ジェイウォークあたりは確認できたしHTMLSQLが格納されているテーブルも見つけた

ソース上でクエリを作ってAPIを作っているが、ザッと見ただけでもインジェクションし放題の状態になっていた

フロントエンドシステム

フロントエンドも詳細は伏せるが、いわゆるReact的なものを利用している

こちらは npm run installでインストールできるし npm run devでちゃんと動く

ローカル動作するので非常に助かる

ただ前述の通りバックエンドローカルで構築できないのでEC2を利用するしかなく、CORS対応のためのプロキシを自前で用意する必要があった

フロントエンドソースコード

バックエンド同様にGitHub管理されているが、管理しているだけ

バックエンドは5人ぐらいが利用しているが、ソースコード編集するのは実質1人なのでコンフリクトほとんど起こさないらしいが

フロントエンドは5人ぐらいが編集するのでコンフリクトしまくっている

解消するときデグレすることが日常茶飯事でその都度Hotfixしている

コードコメントアウトだらけなのに加えて、不必要コードが大量にあるので可読性が著しく低い

(難しい処理を読み解いて追いかけていったら最終的に使われていない、などが大量にある)

2000行ぐらいあるコードとかChatGPTに突っ込んだら20行ぐらいになる予感がある

また、DBがご覧の状態なので取得されるデータ全然抽象化できておらず、コードが膨れ上がっている

例えばProductの一覧データサーバから取得して、ユーザークリックしたProductをCartに投入するのだが、投入する情報Productではなく、CartItemにする必要があるし

OrderするときはOrderItemにしてAPIを叩く必要がある

ほとんど同じ情報なのだ微妙に変わっていたりKey名が違っていたりするのでそれぞれ変換する

他にも数え上げればキリがないが、コピペして少しだけ改変している部分などが大量にあってバグがあるのかどうかすら判別できない

セキュリティ課題

DBHTMLSQLが入っていると言ったが、調べて見るとDBから取得したHTMLをそのまま埋め込んで表示していたりした

SQLについてはフロントエンド側でSQL生成しており、そのテキストAPIに送り込んでサーバ側で実行して貰った上で格納とかしていたので

「ここにDROP TABLEとか書けばTABLE消えるんですか?」

と聞くと

「そんなことする開発者はクビだなwww

とか言われたのでことの重大さを伝えたが、まだ対処できていないようだった

認証等はOAuth2を使っていたので大丈夫そうだったが、本当に大丈夫かどうかは自信がもてない

今後の期待

システム内容はゴミのような状態だがサービス的には良いので、幹部プロダクトオーナーからは追加要望が山盛り来ている

開発チームが「稼働が足りない」という理由で断ったので「じゃぁ支援して」ということで自分のところに来たのだが

申し訳ないが、そもそもそういうレベルに無いし、全て作り直しが必要

と伝えてもどうやら伝わっていない様子

ちなみに元々の開発チームは過去にもこんな感じでサービス作ってたらしいが売れないので問題になってなかった様子

ぱっと見は動いているように見えるのが厄介なところ

正直逃げたいところではある

2023-09-18

CSSフレームワーク公式サンプルを拾ってきてDBから出力したJSON当て込むだけならそりゃ簡単

クソミソに面倒臭くなるのはデザイナークライアントのせい

anond:20230918154228

フロントエンジニアってDBから出力されたJSON変換して画面にするだけのお仕事って聞いたやで

ログイン ユーザー登録
ようこそ ゲスト さん