並び順

ブックマーク数

期間指定

  • から
  • まで

1 - 40 件 / 278件

新着順 人気順

javascript fetch get request exampleの検索結果1 - 40 件 / 278件

  • Ubuntu 24.04 LTS サーバ構築手順書

    0 issue "letsencrypt.org" 0 issuewild "letsencrypt.org" 0 iodef "mailto:yourmail@example.jp" §OS再インストール 初期設定で期待通りの設定ができていない場合は、OSの再インストールをする。 さくらVPSのコントロールパネルから、OSを再インストールするサーバを選ぶ。 www99999ui.vs.sakura.ne.jp §OSのインストール操作 Ubuntu 24.04 LTS を選ぶ。 OSインストール時のパケットフィルタ(ポート制限)を無効にして、ファイアウォールは手動で設定することにする。 初期ユーザのパスワードに使える文字が制限されているので、ここでは簡単なパスワードにしておき、後ですぐに複雑なパスワードに変更する。 公開鍵認証できるように公開鍵を登録しておく。 §秘密鍵と公開鍵の作成 ク

      Ubuntu 24.04 LTS サーバ構築手順書
    • MCPにおけるセキュリティ考慮事項と実装における観点(後編) - GMO Flatt Security Blog

      MCP logo ©︎ 2024–2025 Anthropic, PBC and contributors | MIT license はじめに こんにちは、GMO Flatt Security株式会社 セキュリティエンジニアのAzaraです。普段は、クラウドセキュリティや Web アプリケーションのセキュリティを専門領域にしています。 本稿は MCP のセキュリティを前後編で解説するものの後編です。前編では MCP のセキュリティを、利用者の視点から考察しました。 後編となる本稿では、攻撃者視点から脅威や攻撃手法を整理します。そのうえで、日々増えていく MCP Server の提供者が、これらの脅威やセキュリティ課題をどのように考慮し対策を講じるべきかを解説します。 また、GMO Flatt Securityは日本初のセキュリティ診断AIエージェント「Takumi」や、LLMを活用したア

        MCPにおけるセキュリティ考慮事項と実装における観点(後編) - GMO Flatt Security Blog
      • Cloudflare R2もいいぞ! - ゆーすけべー日記

        CloudflareがSQLデータベースD1をアナウンスして衝撃を受けましたが、「R2もいいぞ!」というお話。 R2はS3みたいなストレージエンジンで、Sの前「R」、3の前の「2」ともじってて、AWS対抗といえます。で、ちょうどD1がアナウンスされた昨日にベータオープンしました。 A New Hope for Object Storage: R2 enters open beta 「ただのストレージだろ」とたかをくくってたんですが、使ってみてだいぶよいです。 先にまとめると以下の3つのことが言えます。 安い DX(Developer Experience)がよい Cloudflareの他の製品を組み合わせるとヤバい 詳しく紹介します。 作ったアプリ R2を評価するために、以前S3をバックエンドにして作ったアプリケーションをR2に置き換えるというのをやりました。そのアプリケーションについては

          Cloudflare R2もいいぞ! - ゆーすけべー日記
        • モダンフロントエンドはJSON APIが鬱陶しいので、無くしていきたい

          はじめに Kaigi on Rails 2025で発表し、何人かの人といろいろ話しているうちに、モダンフロントエンドが面倒臭いのはJSON APIのせいではないかと考えるようになりました。そしてJSON APIそのものが悪いというよりは、JSON APIを必要以上に使う原因となっているSPAが問題ではないかと思っています。まだ考えは固まっていないのですが、まずは部分的に紹介したいと思います。 モダンフロントエンドはJSON基礎工事が大変 SPAのReactフロントエンドを作る場合、Hotwireなら不要だった多大な工数が新しく発生します。 APIエンドポイントのルータおよびコントローラから、JSON APIシリアライザ、クライアントサイドのルータ、JSON APIをfetchしてフォーマット変換する作業、さらにAPIの契約を文書化したOpen APIを作成します。ここには記載していませんが

            モダンフロントエンドはJSON APIが鬱陶しいので、無くしていきたい
          • What's New In DevTools (Chrome 96)  |  Blog  |  Chrome for Developers

            Preview feature: New CSS Overview panel Use the new CSS Overview panel to identify potential CSS improvements on your page. Open the CSS Overview panel, then click on Capture overview to generate a report of your page’s CSS. You can further drill down on the information. For example, click on a color in the Colors section to view the list of elements that apply the same color. Click on an element

            • MCP ツールのコンテキスト圧迫の問題とその解決策

              MCP の普及に伴い、多数のツール定義が LLM のコンテキストを圧迫する課題が浮上しています。本記事では Progressive disclosure(段階的開示)による最小限の情報提供、MCP を使ったコード実行によるツール呼び出しの効率化、単一の検索ツールによるコンテキスト削減など、実践的な解決策を Claude Skills や Cloudflare Code Mode の事例とともに解説します。 Model Context Protocol (MCP) は登場からおよそ 1 年が経過し、事実的な標準としての地位を確立しつつあります。MCP が普及するにつれて、MCP ツールの課題点も浮き彫りになってきました。その課題の 1 つが、1 つのタスクを達成するために多くのツールが読み込まれ、結果として多くのコンテキストが消費されてしまうという問題です。 前提として、LLM がタスクの達

                MCP ツールのコンテキスト圧迫の問題とその解決策
              • SPAで発生しやすい「クライアントサイドパストラバーサル」リスクとその対策 - GMO Flatt Security Blog

                はじめに こんにちは。株式会社GMO Flatt Securityセキュリティエンジニアの森(@ei01241)です。 近年、React、Vue、Angularといったフロントエンドフレームワークを用いたSPAの開発が主流となり、Webアプリケーションにおけるクライアントサイドの役割はますます増大しています。動的なルーティングやAPIからのデータ取得など、多くの処理がJavaScriptによって実行されます。 このようなクライアントサイドでの処理の増加に伴い、新たなセキュリティリスクも生まれています。その一つがクライアントサイドのパストラバーサルです。サーバーサイドのパストラバーサルほど広く認知されていないかもしれませんが、適切に対策しなければ、CSRFやアクセストークンのリークなどにつながる可能性があります。 本稿では、クライアントサイドパストラバーサルがどのような脆弱性であり、どのよう

                  SPAで発生しやすい「クライアントサイドパストラバーサル」リスクとその対策 - GMO Flatt Security Blog
                • Next.js 12

                  As we announced at Next.js Conf, Next.js 12 is our biggest release ever: Rust Compiler: ~3x faster Fast Refresh and ~5x faster builds Middleware (beta): Enabling full flexibility in Next.js with code over configuration React 18 Support: Native Next.js APIs are now supported, as well as Suspense <Image /> AVIF Support: Opt-in for 20% smaller images Bot-aware ISR Fallback: Optimized SEO for web craw

                    Next.js 12
                  • The state of HTTP in 2022

                    At over thirty years old, HTTP is still the foundation of the web and one of the Internet’s most popular protocols—not just for browsing, watching videos and listening to music, but also for apps, machine-to-machine communication, and even as a basis for building other protocols, forming what some refer to as a “second waist” in the classic Internet hourglass diagram. What makes HTTP so successful

                      The state of HTTP in 2022
                    • Writing Good Unit Tests

                      In my first job as a software engineer the project I was working on grew out of control. As often happens, use cases were added without proper refactoring and with more users we were drowning in support tickets and nothing seemed to work. It was clear we needed to push for quality so we started adding unit tests. The tech lead at the time mandated high test coverage. But here's the reality: writin

                      • Hono + Deno で住所分割APIサーバーを2日で爆速実装する - inSmartBank

                        はじめに サーバーサイドエンジニアの mokuo です。普段はカード決済やあとばらいチャージに関連する機能の開発や運用を行っております。 本記事でお話すること 日本の住所を都道府県、市区町村、丁目番地、それ以降などに分割する方法の検討から技術選定、実際に動いているコード(ほぼそのまま)をお見せします。 想定読者 サーバーサイドエンジニアを主な読者として想定しています。 日本の住所を分割する機能の実装方法を知りたい方 Deno*1や Hono*2 の採用事例、実装例を知りたい方 はじめに 本記事でお話すること 想定読者 🤔 背景と課題 🎯 住所分割の方針検討 ✂️ 住所分割方法: normalize-japanese-addresses に決定 🧩 npm ライブラリの組み込み: Hono + Deno に決定 🏠️ インフラ構成: ECS + EFS に決定 💪 2日で実装する

                          Hono + Deno で住所分割APIサーバーを2日で爆速実装する - inSmartBank
                        • Remix vs Next.js

                          Easily the biggest question we get asked is something like: How is Remix different from Next.js? It appears we have to answer this question! We'd like to address it directly and without drama. If you're a fan of Remix and want to start tweeting smug reactions to this article, we kindly ask that you drop the smugness before hitting the tweet button 🤗. A rising tide lifts all boats. We've been frie

                            Remix vs Next.js
                          • The new wave of React state management

                            The new wave of React state managementUnderstand the core problems state management libraries need to solve. And how the proliferation of modern libraries address them in new ways. IntroductionAs React applications grow in size and complexity, managing shared global state is challenging. The general advice is to only reach for global state management solutions when needed. This post will flesh out

                              The new wave of React state management
                            • 【忙しい人のための】Next.js公式チュートリアルを完走してきたので記事1本で振り返る【ギュッと凝縮】 | DevelopersIO

                              本記事はNext.jsのチュートリアルが大きく変わったためリンク切れを起こしています。 技術メモのため記事としては残しますが、リンク切れにご留意ください。 また機会があれば新チュートリアルで記事を書こうと思いますm(_ _)m こんちには。 データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。 今回は以下のNext.jsのチュートリアルをほぼ一通り(SEOのところ以外)実施しましたので、ポイントを記事化しました。 https://nextjs.org/learn/foundations/about-nextjs" チュートリアル自体は、以下のような内容が分かるものとなっています。 CRA(create-react-app)のみ使用しているとイメージしづらい、素のHTML + JavaScriptとReactの関係のイメージが分かる Reactがフレームワークではな

                                【忙しい人のための】Next.js公式チュートリアルを完走してきたので記事1本で振り返る【ギュッと凝縮】 | DevelopersIO
                              • 普段使わないけど便利なWeb API 8選

                                MDNのWeb APIリストから、便利で、しかし普段のサービス開発ではあまり使われていない可能性のあるAPIを8個選びご紹介します。これらのAPIはあまり知られていないかもしれませんが、特定の状況や要件に対して非常に有効であることがあります。 Beacon API Beacon APIは、非同期でブロッキングしないリクエストをWebサーバーに送信するために使用されます。このリクエストはレスポンスを期待しないため、XMLHttpRequestやFetch APIを使ったリクエストとは異なりページがアンロード(ウェブページがユーザーによって閉じられるか、別のページに移動する際)される前にブラウザがビーコンリクエストを開始し、それを完了させることを保証します。 主な使用例としては、クライアント側のイベントやセッションデータをサーバーに送信するために使用されます。このAPIは、navigator.

                                  普段使わないけど便利なWeb API 8選
                                • Google's Guide to Optimizing for Generative AI Features on Google Search | Google Search Central  |  Documentation  |  Google for Developers

                                  SEO fundamentals Introduction Search Essentials SEO Starter Guide Optimizing for generative AI search How Google Search Works Do you need an SEO? Crawling and indexing Sitemaps robots.txt Meta tags Crawler management Removals Canonicalization Redirects JavaScript SEO Ranking and search appearance Visual Elements gallery Title links Snippets Images Videos Structured data Favicons Site-specific guid

                                    Google's Guide to Optimizing for Generative AI Features on Google Search | Google Search Central  |  Documentation  |  Google for Developers
                                  • REST API Design Best Practices Handbook – How to Build a REST API with JavaScript, Node.js, and Express.js

                                    By Jean-Marc Möckel I've created and consumed many API's over the past few years. During that time, I've come across good and bad practices and have experienced nasty situations when consuming and building API's. But there also have been great moments. There are helpful articles online which present many best practices, but many of them lack some practicality in my opinion. Knowing the theory with

                                      REST API Design Best Practices Handbook – How to Build a REST API with JavaScript, Node.js, and Express.js
                                    • Modern Node.js Patterns for 2025

                                      Node.js has undergone a remarkable transformation since its early days. If you’ve been writing Node.js for several years, you’ve likely witnessed this evolution firsthand—from the callback-heavy, CommonJS-dominated landscape to today’s clean, standards-based development experience. The changes aren’t just cosmetic; they represent a fundamental shift in how we approach server-side JavaScript develo

                                      • The Prompt Engineering Playbook for Programmers

                                        Developers are increasingly relying on AI coding assistants to accelerate our daily workflows. These tools can autocomplete functions, suggest bug fixes, and even generate entire modules or MVPs. Yet, as many of us have learned, the quality of the AI’s output depends largely on the quality of the prompt you provide. In other words, prompt engineering has become an essential skill. A poorly phrased

                                          The Prompt Engineering Playbook for Programmers
                                        • Why We're All-In on MCP | Mastra Blog

                                          Why We're All-In on MCPA deep dive into why Mastra is adopting Model Context Protocol (MCP) for AI tool integration, comparing it with Agents.json and Composio, addressing current limitations in discovery, quality, and configuration, and providing a framework-friendly proposal with practical code examples for implementation. Tool integration for AI agents is a mess. Even for developers building ag

                                            Why We're All-In on MCP | Mastra Blog
                                          • Announcing TypeScript 6.0 - TypeScript

                                            Today we are excited to announce the availability of TypeScript 6.0! If you are not familiar with TypeScript, it’s a language that builds on JavaScript by adding syntax for types, which enables type-checking to catch errors, and provide rich editor tooling. You can learn more about TypeScript and how to get started on the TypeScript website. But if you’re already familiar with the language, you ca

                                              Announcing TypeScript 6.0 - TypeScript
                                            • WebKit Features in Safari 16.4

                                              Mar 27, 2023 by Patrick Angle, Marcos Caceres, Razvan Caliman, Jon Davis, Brady Eidson, Timothy Hatcher, Ryosuke Niwa, and Jen Simmons ContentsWeb Push on iOS and iPadOSImprovements for Web AppsWeb ComponentsCSSHTMLJavaScript and WebAssemblyWeb APIImages, Video, and AudioWKWebViewDeveloper ToolingWeb InspectorSafari Web ExtensionsSafari Content BlockersNew Restrictions in Lockdown ModeMore Improve

                                                WebKit Features in Safari 16.4
                                              • GitHub - modelcontextprotocol/servers: Model Context Protocol Servers

                                                Official integrations are maintained by companies building production ready MCP servers for their platforms. 21st.dev Magic - Create crafted UI components inspired by the best 21st.dev design engineers. 2slides - An MCP server that provides tools to convert content into slides/PPT/presentation or generate slides/PPT/presentation with user intention. ActionKit by Paragon - Connect to 130+ SaaS inte

                                                  GitHub - modelcontextprotocol/servers: Model Context Protocol Servers
                                                • Rustで将棋の局面画像生成、そしてCDN Edgeで動的生成 - すぎゃーんメモ

                                                  背景 先行・類似事例 自作のメリット Rustで局面画像生成 盤・駒画像の素材 画像処理 入出力 Generatorと下準備 Publish Web Appで使う CDN Edgeで動かす wasm-packでWebAssembly作成 Deno Deploy Vercel Edge Functions Cloudflare Workers Fastly Compute@Edge その他 まとめ Repository 背景 ATrium という AT Protocol のためのライブラリを自作している が、まったくドッグフーディングしていなかった ので、Blueskyに詰将棋の問題を放流するBotを作ってみることにした gfx氏が作ったBot を参考に というわけで、詰将棋の問題の局面を画像で投稿したい が、あまり自分好みの画像を生成できるライブラリやWebサービス等がない ので、結局それ

                                                    Rustで将棋の局面画像生成、そしてCDN Edgeで動的生成 - すぎゃーんメモ
                                                  • Node.js fetch の内部の話 - from scratch

                                                    前置き この記事は リクルートエンジニアアドベントカレンダーの3日目の記事です。 Recruit Engineers Advent Calendar 2022 - Adventar ちなみにココで書いたやつを一部抜粋させていただいております(ネタ切れにより過去投稿を利用してしまっております。。。すいません。。。) www.codegrid.net fetch が Node v18 から試験的にサポートされた ブラウザでは数年前から採用されていた HTTP リクエストを行う関数の fetch が global 空間に関数として作成されました。使うだけなら特に何のフラグもいりません、その代わり使うと Experimental であることを知らせる Warnings が出ます。 // fetch.mjs const response = await fetch('https://api.gith

                                                      Node.js fetch の内部の話 - from scratch
                                                    • What's New In DevTools (Chrome 94)  |  Blog  |  Chrome for Developers

                                                      Use DevTools in your preferred language Chrome DevTools now supports more than 80 languages, allowing you to work in your preferred language! Open Settings, then select your preferred language under the Preferences > Language dropdown and reload DevTools. Preferences" width="800" height="494"> Chromium issue: 1163928 New Nest Hub devices in the Device list You can now simulate the dimensions of Ne

                                                      • Introducing Ezno

                                                        Ezno is an experimental compiler I have been working on and off for a while. In short, it is a JavaScript compiler featuring checking, correctness and performance for building full-stack (rendering on the client and server) websites. This post is just an overview of some of the features I have been working on which I think are quite cool as well an overview on the project philosophy ;) It is still

                                                          Introducing Ezno
                                                        • Node.js

                                                          We’re excited to announce that Node.js 18 was released today! Highlights include the update of the V8 JavaScript engine to 10.1, global fetch enabled by default, and a core test runner module. Initially, Node.js 18 will replace Node.js 17 as our ‘Current’ release line. As per the release schedule, Node.js 18 will be the 'Current' release for the next 6 months and then promoted to Long-term Support

                                                            Node.js
                                                          • htmz - a low power tool for html

                                                            =>htmz> a low power tool for html htmz is a minimalist HTML microframework for creating interactive and modular web user interfaces with the familiar simplicity of plain HTML. [GitHub] plain🍦 Use straight up HTML. No supersets. No hz- ng- hx- v- w- x-; no special attributes. No DSLs. No <custom-elements>. Just vanilla HTML. lightweight🪶 166 bytes in total. Zero dependencies. Zero JS bundles to l

                                                            • Next.js 13 vs Remix: An In-depth case study — Prateek Surana

                                                              When it comes to building web applications, React has been at the forefront for a while now, and its adoption continues to grow. Among the most common approaches to building web applications with React, Next.js stands out as one of the most preferred options. Next.js has also been in the limelight since last year when they released their biggest update to the framework ever with the app router. Th

                                                                Next.js 13 vs Remix: An In-depth case study — Prateek Surana
                                                              • How modern browsers work

                                                                Note: For those eager to dive deep into how browsers work, an excellent resource is Browser Engineering by Pavel Panchekha and Chris Harrelson (available at browser.engineering). Please do check it out. This article is an overview of how browsers work. Web developers often treat the browser as a black box that magically transforms HTML, CSS, and JavaScript into interactive web applications. In tru

                                                                  How modern browsers work
                                                                • Cloudflare Workers + Hono ワークショップ - ServerlessDays Tokyo 2023

                                                                  Cloudflare Workers + Hono ワークショップ 資料はこちら => workshops.yusuke.run #serverlessdays Yusuke Wada 2023-09-24 ServerlessDays Tokyo 2023 workshops.yusuke.run アジェンダ ワークショップについて Workers イントロダクション Hono イントロダクション 基本編 プロキシ編 Web API編 フルスタック編 AI編 Honoをより深く知る その他 1. ワークショップについて 1.1 対象 対象者 Cloudflareでのアプリケーション作成に興味のある方 Honoを使ってみたい方 フロント、バックエンド問いません 前提条件 Wranglerが動く環境をつくっておく npx wrangler が動く JavaScriptに対する知識があるとよい

                                                                    Cloudflare Workers + Hono ワークショップ - ServerlessDays Tokyo 2023
                                                                  • モダンなJavaScript/TypeScript実行環境「Deno」

                                                                    class: middle, center <img src="./assets/logo.svg" align="center" width="200" /> モダンな JavaScript/TypeScript 実行環境 Deno --- class: middle, center 「Deno」 聞いたことありますか? 🙋‍♀️ 🙋‍♂️ --- class: middle, center 「Deno」 使ったことありますか? 🙋‍♀️ 🙋‍♂️ --- class: middle, center 今日は Deno を 「聞いた事ない」 ~ 「触った事はある」 ぐらいの人向けの話をします --- # 話す人 <img src="./assets/hinosawa.jpg" align="right" width="300" /> 日野澤歓也 twitter @kt3k Web

                                                                      モダンなJavaScript/TypeScript実行環境「Deno」
                                                                    • Pure Rustな近似最近傍探索ライブラリhoraを用いた画像検索を実装する - Stimulator

                                                                      - はじめに - 本記事は、近似最近傍探索(ANN: Approximate Nearest Neighbor)による画像検索をRustを用いて実装した際のメモである。 画像からの特徴量抽出にTensorFlow Rust bindings、ANNのインデックス管理にRustライブラリであるhoraを利用した。 RustとANNの現状および、実装について触れる。 - はじめに - - RustとANN - - pretrainモデルによる特徴量化 - - 画像特徴のインデックスと検索 - - 検索結果 - - おわりに - - RustとANN - Rustの機械学習関連クレート、事例をまとめたリポジトリがある。 github.com この中でも、ANN関連のクレートは充実している。利用する場合は以下のようなクレートが候補になる。 * Enet4/faiss-rs * lerouxrgd/

                                                                        Pure Rustな近似最近傍探索ライブラリhoraを用いた画像検索を実装する - Stimulator
                                                                      • Why your website should be under 14kB in size | endtimes.dev

                                                                        Having a smaller website makes it load faster — that's not surprising. What is surprising is that a 14kB page can load much faster than a 15kB page — maybe 612ms faster — while the difference between a 15kB and a 16kB page is trivial. This is because of the TCP slow start algorithm. This article will cover what that is, how it works, and why you should care. But first we'll quickly go over some of

                                                                        • Next.js vs. Remix - A Developer's Dilemma

                                                                          Next.js vs. Remix - A Developer's Dilemma Feb 21, 2024 I am a Javascript and React enthusiast, and I absolutely love writing technical blogs. There's just something about the process of breaking down complex concepts and sharing my knowledge with others that really excites me. In my free time, I enjoy exploring my other passions, such as painting, gardening, cooking, and managing my food blog. The

                                                                            Next.js vs. Remix - A Developer's Dilemma
                                                                          • Streaming JSON in just 200 lines of JavaScript

                                                                            I was continueing my exploration of React server components when I stumbled upon on this article about progressive JSON. Dan Abramov describes a technique for streaming JSON from a server to a client in chunks, allowing the client to start rendering parts of the data before the entire payload has been received. This can significantly improve perceived performance, especially for large datasets. So

                                                                              Streaming JSON in just 200 lines of JavaScript
                                                                            • Auth0徹底活用ガイド:導入エンジニアが知るべき技術的ポイントとベストプラクティス - ACES エンジニアブログ

                                                                              タイトル はじめに:Auth0導入の動機と本記事で得られること Auth0のコアコンセプトを理解する テナント (Tenant): 分離と管理の基本単位 アプリケーション (Application): 認証・認可の対象 API (Resource Server): 保護対象リソース コネクション (Connection): 認証方法 Actions: 認証フローのカスタマイズ コアコンセプトのまとめ Auth0環境構築の実践 テナント戦略:開発・ステージング・本番環境の分離 アプリケーション設定:種類と主要パラメータ API(リソースサーバー)の定義と設定 認証フローの実装:詳細ガイド 適切な認証フローの選択 Auth0 SDKの活用(例:React SDKでの実装ポイント) コールバック処理、トークン管理とセッション (SPAにおけるベストプラクティス) Auth0 Actionsによる

                                                                                Auth0徹底活用ガイド:導入エンジニアが知るべき技術的ポイントとベストプラクティス - ACES エンジニアブログ
                                                                              • Ruby Concurrency: What Actually Happens

                                                                                Since I wrote about async Ruby and patched Solid Queue to support fibers, people keep asking the same questions. What happens when a fiber blocks? Don’t you still need threads? What about database transactions? What about Ractors? This post answers all of it. From the ground up. The four primitives Ruby gives you four concurrency primitives: processes, threads, fibers, and Ractors. They nest. Ever

                                                                                  Ruby Concurrency: What Actually Happens
                                                                                • Prettier 3.0: Hello, ECMAScript Modules! · Prettier

                                                                                  We are excited to announce the release of the new version of Prettier! We have made the migration to using ECMAScript Modules for all our source code. This change has significantly improved the development experience for the Prettier team. Please rest assured that when using Prettier as a library, you can still use it as CommonJS as well. This update comes with several breaking changes. One notabl

                                                                                    Prettier 3.0: Hello, ECMAScript Modules! · Prettier