Code Monkey home page Code Monkey logo

manuscript's Introduction

kyonenya

技術

  • Next.js, React(フロントエンド)
  • Node.js(バックエンド)
  • TypeScript

作ったもの

  • メインで運用しているブログサイト
  • ノーフレームワーク、ブラウザ標準のAPIだけで作成したSPA(シングルページアプリケーション)
  • 使用技術:Vanilla JS, TypeScript, Web Components
  • 自分が書き溜めている研究草稿を管理するためのWebアプリ。日記アプリ Day One からのJSONインポートや記事の一括印刷に対応
  • Next.js でフロントエンドとバックエンドをまとめて一つのアプリとして開発中
  • 使用技術:Next.js, tRPC, Tanstack Query→Server Components & Server Actions, Prisma, PostgreSQL, Chakra UI→Tailwind CSS, Vercel, Supabase Auth, Isomorphic JavaScript (Universal JavaScript)

PDFを読み込んだ ChatGPT が質問に答えてくれるアプリ

  • PDF文書の中から質問に関連しそうな箇所を類似度検索をかけて抽出。質問文と合わせてプロンプトとして送信し、応答をリアルタイムで表示する
  • 使用技術:Langchain.js, OpenAI API (chatgpt-3.5-turbo-16k), Vercel AI SDK, Next.js
  • テキスト検索の結果文字列を生成する util 関数を npm パッケージとして切り出して公開しておいた
    • 1と2のアプリで使用中
  • 使用技術:TypeScript, 関数型プログラミング

manuscript's People

Contributors

kyonenya avatar

Watchers

 avatar  avatar

manuscript's Issues

feat: 記事リストの複数選択

  • 「選択」ボタンを押すと記事アイテムが選択可能になる、選択すると背景色が変わる
    • デザインを変えなくていいというメリットがある
    • 個別記事へのリンクをDisableする必要はある
  • どのアイテムが選択されているかはPostListコンポーネントが保持する
    • react-hook-formのuseWatch? でもヘッダーと違ってこれはformじゃないんだから素のuseStateで保持する
    • 複数削除・複数表示、等々のイベントハンドラを受け取って、自分が持っているuuidリストを注入してSubmitする
  • 選択モードボタンと全選択ボタンをどこに設置するか
    • いずれフッターメニューを作るのでそこに

あとでやる

  • 全選択ボタン:フッターメニュー作ったら
  • 複数選択してプレビュー表示:「プレビュー表示の仕組みを作る」issueでやる

Supabase Authのアップデート

import { cookies } from 'next/headers'
import { createServerComponentClient } from '@supabase/auth-helpers-nextjs'

export default async function Home() {
  const supabase = createServerComponentClient({ cookies })
  const { data } = await supabase.from('todos').select()
  return <pre>{JSON.stringify(data, null, 2)}</pre>
}

refactor: GraphQLの導入

設計

  • ひとまず[uuid]ページから作ろうかな。getEntryとtagListの二つで足りるから。searchEntriesは少し複雑そうなので後回しにする
    • まずはgraphql-playgroundからリゾルバーを切り離してdomainに置こう
  • もしかしてApollo Serverをローカルホストで立ち上げておいてからフロント側のcodegenをすればスキーマファイルをクラサバ共有しなくてもいけるか?
    • もしそれならgraphql-composeも使えるぞ
    • いずれにせよcodegenはフロント側は必須で、API側はもしかすると省略できるかも
  • リゾルバーは/domainに置いていいかな
  • Playground用に全てのエンドポイントを集約したリゾルバーリストを作っておいて、それを/pages/api以下で個々バラして使うのか。まずはリゾルバーリストを作るか
  • graphql-composeは使えない
    • クラサバ同型でschema.graphqlファイルを読み取ってcodegenする必要があるため、スキーマをtsファイルで持つことができない
    • ベーシックに.graphqlファイルのテキストベースで実装してみる

参考

メモ

feat: 記事インポートを数百件づつ分割する

1000件程度一気に記事をインポートしようとするとvercelのAPI制限に引っかかる。
数百件づつ分割して同時にAPIを叩けば回避できそう。

Serverless Function Execution Timeout (Seconds): 10

The maximum number of concurrent executions for Serverless Functions is 1000 by default.
Limits – Vercel Docs

設計

クライアントサイドでやりくりする案件。

useMutationフック自体を複数そのつど初期化するのか?
createEntriesWithQueueみたいなカスタムフックを新しく作って、引数やバリデーション、叩くAPIのパスはcreateEntriesと同じにして、mutation関数だけqueueにする

参考

feat: 記事のエクスポート

  • 設定ページの作成
  • 記事を期間指定して取得するクエリ
  • APIから得た記事データをフロント側でJSONに変換
  • 既存のDayOneデータとメタデータをマージする(やらなくてもいい)
    • というかこれさえなければ設定ページを作らなくて済んだかも…

refactor: React Queryのクエリの一元管理

要件

  • query keyの一元管理をする。invalidateするときのキーが間違っていることがある
  • useMutationフックの置き場所をuseCase層に置く? invalidate系の処理もuseCaseに書いてよいはず
    • 全件削除したら全件再取得、一件更新したら一件再取得など、invalidateは立派なビジネスロジックを成している
    • queryClientはフック外で初期化できないので、引数として渡せばいい
    • queryClientは関数内で宣言できるので結論ぜんぶuseCaseに書けばいい、クエリキーも一緒に
  • 要らないコンポーネントを削除 SettingsPageが消せるはず
  • useJsonImport -> useLoadJson?

参考

refactor: JSONファイルアップロードのリファクタ

現状、カスタムフックを使って useState を使ってしまっているが、要らないはず。formのsubmit時にPromise化されたFileReader使用関数を実行すればよい。

const inputFile = document.querySelector('input[type="file"]');
inputFile.addEventListener('change', handleFileUpload);

async function handleFileUpload(event) {
  const file = event.target.files[0];
  const fileText = await readFileAsText(file);
  const jsonObject = JSON.parse(fileText);

  console.log(jsonObject); // This will be your JSON object
}

function readFileAsText(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    
    reader.onload = event => resolve(event.target.result);
    reader.onerror = error => reject(error);
    
    reader.readAsText(file);
  });
}
  • FileReader APIをPromise化する方法 - Qiita
    • reader.onloadのところを、reader.addEventListener("load", () => ...)というように変更しました。
      通常、JavaScriptではel.onclick = () => {}というように、.onを使ってEventListenerを追加するやり方は推奨されていないのです」
    • へー

feat: アプリの方針そのものの見直し

反省点

DayOneのクローンアプリは筋が悪い。エディタは捨ててReadOnlyに倒す方がいい。

  • DayOne(iOSの日記アプリ)を捨ててWebアプリを運用しようとしても、いまいち自分のWebアプリを信用しきれず、記事データをDayOne側にも手動で同期させたくなるはず
  • Webアプリ側で編集したりタグ付けたりして、それをDayOneに移してDayOne側でも編集して……となってしまう
    • データの流れは一方向にすべき
  • エディタの質でネイティブアプリに勝てることはない

機能

DayOneができない機能だけを補完して、痒いところに手の届くアプリにする。

機能:複数選択して一括印刷

自分は論文を書く前に、これまで書き溜めた草稿を選定した上で、それを印刷して読み直す習慣がある。ここを自動化したい。

  • 記事一覧ページで、まず検索ワードやタグで絞り込み、その中からさらに複数選択して印刷
  • iOSのマークダウンエディタはどれも満足な印刷機能を持っていない
    • Ulyssesならできるが、サブスクリプションが必要で、しかもCSSを弄るのがかなり面倒
  • マークダウンを正しく美しくレンダリングする機能があるだけで充分

機能:記事データの一括インポート

↑を実現するための機能。

refactor: Prismaの導入

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.