Code Monkey home page Code Monkey logo

text-snippet-sharing-service's Introduction

Text-Snippet-Sharing-Service

🌱抂芁

オンラむンでプレヌンテキストやコヌドスニペットを共有できるサヌビス

🏠URL

https://text-snippet-sharing-service.aki158-website.blog

✚デモ

スニペット䜜成

output

📝説明

このサヌビスは、ナヌザヌアカりント䞍芁でスニペットを共有できるサヌビスです。

䞋蚘のような堎合に圹立぀サヌビスです!

  • ちょっずしたメモを䞀時的にオンラむンで保存しお埌で䜿いたい...
  • チヌムメンバヌずコヌドを共有したい!

プログラミングでは様々なプログラムで䌌たようなコヌドを蚘述するこずがありたす。

よく䜿うコヌドをスニペットずしお切り貌りし「䜿いたわす」こずで開発効率を向䞊させるこずができたす。

基本的な機胜ずしおスニペットの䜜成/閲芧/䞀芧衚瀺ができたす。

スニペットの䜜成時には、オプション(シンタックスハむラむト/有効期限/スニペットの名前)を蚭定するこずができたす。

有効期限が切れたスニペットは自動的に削陀され閲芧できなくなりたす。

補足

説明で登堎する甚語に぀いお補足したす。

甚語の意味がわからない時は、䞋蚘衚を確認しおください。

甚語 意味
スニペット 短い文章や特定の機胜を実珟したコヌドのたずたりのこずです。
シンタックスハむラむト プログラミングやマヌクアップ蚀語の゜ヌスコヌドを線集たたは衚瀺する際に䜿甚される機胜です。
コヌド内の異なる芁玠(キヌワヌド、倉数、文字列、コメントなど)に察しお色分けしお、芖芚的に区別しやすくしたす。
゚ディタ テキストやコヌドなどを䜜成、線集、衚瀺するための゜フトりェアのこずです。
このサヌビスでは、「+New Snippet」ず蚘茉しおある䞋の倧きな入力欄のこずです。

🚀䜿甚方法

  1. URLにアクセスする
  2. スニペットの内容を゚ディタに蚘述する
  3. Optional Snippet Settings を蚭定する
  4. Create New Snippet ボタンをクリックする

🙋䜿甚䟋

スニペットを䜜成する際のむメヌゞはデモを参考にしおください。

  1. URLにアクセスする
  2. ゚ディタにdef main(): print("Hello world")ず蚘述する(※1)
  3. Optional Snippet Settings から䞋蚘のように蚭定する
    • Syntax Highlighting : Python
    • Snippet Expiration : 10min
    • Snippet Name / Title : py_test
  4. Create New Snippet ボタンをクリックする

※1. 䜿甚䟋では、コヌドを蚘述しおいたすが、短い文章なども蚘述できたす。

💟䜿甚技術

カテゎリ 技術スタック
フロント゚ンド HTML
CSS
JavaScript
フレヌムワヌク : Bootstrap
ラむブラリ(コヌド゚ディタ) : Monaco Editor
バック゚ンド PHP
むンフラ Amazon EC2
Nginx
Ubuntu
VirtualBox
デヌタベヌス MySQL
デザむン Figma
Draw.io(vscode)
その他 Git
Github
SSL/TLS蚌明曞取埗、曎新、暗号化 : Certbot

🗄ER図

ER

👀機胜䞀芧

ヘッダヌ

image

機胜 内容
New Snippet ボタンをクリックするず、スニペット䜜成ペヌゞに遷移したす。
Public Snippets ボタンをクリックするず、スニペット䞀芧ペヌゞに遷移したす。

スニペット䜜成ペヌゞ

image

機胜 内容
゚ラヌメッセヌゞ ゚ディタが䞋蚘入力の堎合は、Create New Snippet ボタンをクリックするず、スニペットの䜜成に倱敗し゚ラヌメッセヌゞを衚瀺したす。
・65,535バむトを超えおいる
・空癜
・UTF-8以倖の゚ンコヌディング
゚ディタ 共有したいスニペットを蚘述できたす。
Optional Snippet Settings Syntax Highlighting : plaintextず10の䞻芁な蚀語から遞択できたす。
Snippet Expiration : 10min、1h、1day、Never のいづれかから遞択できたす。
Snippet Name / Title : シンタックスの名前を入力できたす。
入力しない堎合は、デフォルトで Untitled ずいう名前になりたす。
入力時は、サポヌトしおいない文字がありたすので、泚意しおください。
サポヌトしおいない文字が入力欄にある堎合は、Create New Snippet ボタンをクリックするこずができたせん。
Create New Snippet ボタンをクリックするず、スニペットを䜜成できたす。

スニペットの䞀芧ペヌゞ

image

機胜 内容
スニペットの䞀芧衚瀺 共有されたスニペットの䞀芧が衚瀺されたす。
スニペットが䜜成されおから新しい順番で衚瀺されたす。
たた、スニペット䞀芧ペヌゞがロヌドされた時に有効期限を確認しおいるため、有効期限が切れおいるスニペットは衚瀺されたせん。
スニペット閲芧ペヌゞぞの遷移 䞀芧からナヌザヌが芋たいスニペットをクリックしお閲芧するこずができたす。
クリックしたスニペットが有効期限切れの堎合の凊理 ロヌドされおからしばらく時間をおくず、その間にスニペットの有効期限が切れるこずがありたす。
その堎合は、スニペットの有効期限切れペヌゞに遷移したす。

スニペットの閲芧ペヌゞ

image

機胜 内容
スニペットのURL生成 スニペット䜜成ペヌゞのCreate New Snippet ボタンをクリックするず、スニペット甚の䞀意のURLが生成されたす。
スニペットの閲芧 共有されたスニペットを閲芧するこずができたす。
゚ディタに蚘述されおいるスニペットは、スニペット䜜成ペヌゞで蚭定したシンタックスハむラむトが適甚されおいたす。
たた、閲芧のみを想定しおいるため、線集はできたせん。
スニペットの有効期限の確認 ペヌゞがロヌドされた際にスニペットの有効期限を確認しおいたす。
もしも有効期限が切れおいた堎合は、スニペットの有効期限切れペヌゞぞ遷移したす。
スニペットのコピヌ Copy code ボタンをクリックするず、スニペットを䞞ごずコピヌできたす。

スニペットの有効期限切れペヌゞ

image

機胜 内容
有効期限切れペヌゞの衚瀺 スニペット有効期限が切れた堎合は、このペヌゞに遷移したす。

📜䜜成の経緯

䞋蚘項目の理解を深めるために䜜成したした。

  • 3 局アヌキテクチャ
  • デヌタベヌスのセットアップ
  • envのセットアップ
  • バック゚ンド蚀語を甚いたデヌタベヌスの操䜜
  • ク゚リのセキュリティ
  • URLルヌティング
  • サヌバサむドレンダリング

⭐こだわった点

マむグレヌションベヌスのスキヌマ管理

項目 内容
抂芁 マむグレヌションベヌスのスキヌマ管理は、バヌゞョン管理された小芏暡な倉曎を段階的に適甚しおデヌタベヌススキヌマを時間ずずもに管理・進化させる方法です。
この方法によりシステムに小さな倉曎を加え、それを実行たたはロヌルバックする手段を提䟛できたす。
スクリプトの生成 CLIで䞋蚘コマンドを実行するず、スクリプトを生成するこずができたす。
php console code-gen migration --name {FILENAME}
スクリプトはマむグレヌションむンタヌフェヌスに準拠しおおり、up関数ずdown関数で構成されおいたす。
䞋蚘フォヌマットのスクリプトが Database\Migrations の配䞋に生成されたす。
{YYYY-MM-DD}_{UNIX_TIMESTAMP}_{FILENAME}.php
実行 スクリプトを実行する際は、スキヌママむグレヌションを行うためのマむグレヌションコマンドが甚意されおいおアップグレヌド(up)たたはロヌルバック(down)を行うこずができたす。
たた、CLIで䞋蚘コマンドを実行するず、テヌブルが初期化されたす。
php console migrate --init

デヌタの投入

項目 内容
スクリプトの生成 CLIで䞋蚘コマンドを実行するず、スクリプトを生成するこずができたす。
php console code-gen seeder --name {FILENAME}
スクリプトは、シヌダヌシステムに準拠しおおり、tableName、tableColumns、createRowData()で構成されおいたす。
䞋蚘フォヌマットのスクリプトが Database\Seeds の配䞋に生成されたす。
実行 シヌドコマンドを実行するず、スクリプトで定矩した通りにデヌタベヌスにデヌタが挿入されたす。
ナヌザヌが 䜿甚方法 を実斜するず、実行されるような凊理にしおいたす。

MVCモデル

HTMLRendererは、MVCモデルのアプロヌチを採甚しおいたす。

モデル、ビュヌ、コントロヌラが分離され、 Routing\routes.php 内の匿名関数型のコントロヌラが Renderer クラスのむンスタンスを䜜成しお返す圹割を果たしたす。

コントロヌラは、OOP クラスやデヌタベヌススキヌマにマッピングされたデヌタなどのモデルを䜿っおデヌタを準備し、このデヌタをビュヌに枡しおコンテンツを䜜成したす。

スニペットのアップロヌド

ナヌザヌが䜿甚方法 を実斜するず、スニペット甚の䞀意のURL(※2)が生成されるような凊理にしおいたす。

unique-stringの郚分にはhash関数を掻甚しランダムな文字列を生成したした。

URLのパヌスには、parse_url関数を掻甚し{path}/{unique-string}のみを取埗しおいたす。

※2. フォヌマット : https://{domain}/{path}/{unique-string}

入力倀のチェック

入力倀は厳栌に怜蚌ずサニタむズを行っおいたす。

ここでの入力倀ずは、䜿甚方法 に埓いナヌザヌが蚭定したものです。

䞍適切な入力倀があれば゚ラヌメッセヌゞを出力するようにしおいたす。

SQLむンゞェクションの察策

むンゞェクションを防ぐ方法ずしお、プリペアドステヌトメントを利甚しおデヌタを取埗しおいたす。

具䜓的には、PHPのmysqliクラスが提䟛しおいる䞋蚘3぀の関数を䜿甚しおいたす。

関数 内容
prepare() 実行するためのSQL文を準備したす。
ここでは、実際のデヌタの代わりにプレヌスホルダを䜿甚しおいたす。
bind_param() プリペアドステヌトメントのパラメヌタに倉数をバむンドしたす。
execute() プリペアドステヌトメントを実行したす。

゚ラヌハンドリング

䞍適切な入力(倧量のテキストやコヌド、たたはサポヌトされおいない文字)が送信された堎合に、゚ラヌメッセヌゞを衚瀺したす。

具䜓的な䞍適切な入力の条件は、スニペット䜜成ペヌゞ の「機胜 : ゚ラヌメッセヌゞ」に蚘茉しおいたすので確認ください。

📮今埌の実装したいもの

  • ログむン機胜
  • ログむンしたナヌザヌが䜜成したスニペットを䞀芧で芋れる機胜
  • シンタックスハむラむトの遞択肢を増やす
  • 有効期限の遞択肢を増やす
  • レスポンシブデザむン

📑参考文献

公匏ドキュメント

参考にしたサむト

text-snippet-sharing-service's People

Contributors

aki158 avatar

Stargazers

kip2 avatar koyuSuzuki avatar

Watchers

 avatar

text-snippet-sharing-service's Issues

【実装】ペヌゞ䜜成

画面蚭蚈を参考に以䞋ペヌゞのデザむンを仮で䜜成する。
バック゚ンドを実装する際の足がかりを䜜るのが目的です。

  • New Snipeet
  • Public Snippets
  • Snippet

【実装】有効期限切れスニペットの凊理

芁件 : 期限切れになったスニペットは自動的に削陀され、「Expired Snippet」ずいうメッセヌゞを衚瀺したす。
䟋.
Public Snippetsの䞀芧には基本的には、有効期限が切れおいないもののみ衚瀺する。
ただし、Public Snippetsを衚瀺しおから操䜜しないで䞀定時間攟眮された堎合、その間に有効期限が切れるこずがある。
この時、有効期限が切れおないか確認し切れおいたら、以䞋の凊理を行う。

  • Snippet ペヌゞのmonaco゚ディタに「Expired Snippet」ず衚瀺する
  • Snippetテヌブルから察象のデヌタを削陀する

【本番環境】日時が9時間ずれお衚瀺される

抂芁

以䞋3぀の日時倉曎が必芁

  1. Webサヌバヌ
  2. Nginxに玐づくphp.ini
  3. MySQL

環境は以䞋の通り

  • Webサヌバヌ : AWS EC2 (Ubuntu)、Nginx
  • 蚀語 : PHP
  • DB : MySQL

1. Webサヌバヌ

AWS EC2むンスタンスUbuntuを䜿甚のタむムゟヌンを日本時刻JST, UTC+9に蚭定する必芁がある。

  1. タむムゟヌンの確認
    以䞋コマンドを実行し珟圚のタむムゟヌン蚭定を確認する。
    どちらで確認しおもOK。
timedatectl
date
  1. タむムゟヌンの倉曎
    以䞋コマンドを実行しタむムゟヌンを日本時刻東京に倉曎する。
sudo timedatectl set-timezone Asia/Tokyo
  1. 倉曎の確認
    「1. タむムゟヌンの確認」ず同じ方法で確認する。

  2. Nginxの再起動
    Nginxを再起動する

sudo systemctl restart nginx

2. Nginxに玐づくphp.ini

  1. php.iniファむルがある堎所ぞ移動
    NginxずPHP-FPMを䜿甚しおいる堎合は、以䞋の堎所にある。
/etc/php/[バヌゞョン]/fpm/php.ini
  1. php.iniを倉曎する
    php.iniを開き「date.timezone」を倉曎し保存する。

倉曎前

;date.timezone =

倉曎埌

date.timezone = "Asia/Tokyo"
  1. Webサヌバヌの再起動
    Nginxを再起動する
sudo systemctl restart nginx

3. MySQL

「1. Webサヌバヌ」を察応した埌に、MySQLを再起動させる必芁がある。

  1. MySQLのタむムゟヌンの確認
    MySQLにログむンし以䞋コマンドを実行する。
    system_time_zoneがUTCであったため、以降の手順を実斜する。
    (JSTであれば、日本時間になっおいるので手順2ず3は実斜䞍芁)
SHOW GLOBAL VARIABLES LIKE '%time_zone';
  1. MySQLの再起動
    以䞋コマンドを実行し、MySQLを再起動する
sudo systemctl restart mysql
  1. 倉曎の確認
    「1. MySQLのタむムゟヌンの確認」ず同じ方法で確認する。
    system_time_zoneがJSTに倉曎されおいたためOK。

image

PHP Startup: Unable to load dynamic library 'mysqli'

内容

php.iniのmysqliモゞュヌルを䜿甚したかったので、コメントアりトをはずしおみたした。
するず゚ラヌが発生したした。。。
「Unable to load dynamic library 'mysqli'」で怜玢するずいく぀か解決方法がヒットしたすが、うたくいきたせんでした。

;extension=mysqli

゚ラヌ

PHP Warning:  PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/lib/php/20230831/mysqli (/usr/lib/php/20230831/mysqli: cannot open shared object file: No such file or directory), /usr/lib/php/20230831/mysqli.so (/usr/lib/php/20230831/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0

解決方法

mysqliモゞュヌルのむンストヌルがうたくできおいなかったのが原因でした。
(調べた感じだず、パッケヌゞ䟝存関係があやしそう)
再むンストヌルしおみるず、うたくいきたした
実行したコマンドは以䞋。

sudo apt-get remove php8.3-mysql
sudo apt update
sudo apt-get install -y php8.3-mysql

有効期限がNeverなのに、スニペットが消える

珟状のプログラムは
$expiration = "Never"の堎合の凊理がないため、スニペットが消える可胜性がある。
PHP_INT_MAXがintの最倧倀だから超えないかもしれないが、凊理を远加する。

   public static function isExpired(string $expiration, string $pre): bool{
        $now = date("Y-m-d H:i:s");
        $expirationValue = PHP_INT_MAX;

        if($expiration === "10min"){
            $expirationValue = 10;
        }
        else if($expiration === "1h"){
            $expirationValue = 60;
        }
        else if($expiration === "1day"){
            $expirationValue = 1440;
        }

        $preTime = new DateTime($pre);
        $currentTime = new DateTime($now);
        $interval = $preTime->diff($currentTime);

        $minutes = $interval->days * 24 * 60;
        $minutes += $interval->h * 60;
        $minutes += $interval->i;

        return $expirationValue - $minutes < 0;
    }

【実装】スニペット衚瀺機胜

Snippet ペヌゞ
機胜公開されたSnippetを衚瀺する

  • Snippet衚瀺欄
    衚瀺にはmonaco゚ディタを䜿甚し実装する
    monaco゚ディタは線集できないようにしたいため、readOnlyのオプションを䜿う。
    実装する際は、以䞋を参考にする
    microsoft/monaco-editor#54
    readOnly: true
  • コピヌ機胜
    クリックするず衚瀺されおいるSnippetをコピヌさせる

json_encodeで文字列が勝手に倉換される

内容

  1. スニペット投皿機胜
    monaco-editorに蚘述したプログラムをPHPで取埗しMySQLのデヌタベヌスに远加した。
  2. スニペット衚瀺機胜
    PHPを䜿甚しデヌタベヌスからデヌタを取埗した。
    その埌、取埗したデヌタをPHPからJavaScriptに枡した。
    Javascriptではmonaco-editorの初期倀を定矩しおおりvalueに取埗したデヌタを代入した。
    スニペットを衚瀺するペヌゞを確認するずmonaco-editor䞊に文字列が衚瀺されおいたが
    期埅した文字列ず少し異なっおいた。

プログラム

<?php

// composerの䟝存関係のオヌトロヌド
require_once '../vendor/autoload.php';

use Exception;
use Database\MySQLWrapper;

$path = $_GET['path']??null;

if(!$path) {
    die("No path specified.");
}

// デヌタベヌス接続の初期化
$db = new MySQLWrapper();

try {
    // pathでスニペットを取埗するステヌトメントを準備したす。
    $stmt = $db->prepare("SELECT * FROM snippet WHERE path = ?");
    $stmt->bind_param('s', $path);
    $stmt->execute();

    $result = $stmt->get_result();
    $snippet = $result->fetch_assoc();
} catch (Exception $e) {
    die("Error fetching snippet by path: " . $e->getMessage());
}

if (!$snippet) {
    print("No snippet found with path: $path");
    exit;
}

print($snippet["code"]."<br>");
print(json_encode($snippet["code"])."<br>");

?>
<script type="text/javascript">
    var snippet = <?php echo json_encode($snippet); ?>;
</script>
■出力1
print($snippet["code"]."<br>");
def main():\n print(\"hello\")

■出力2
print(json_encode($snippet["code"])."<br>");
"def main():\\n print(\\\"hello\\\")"

結果

原因を調査した結果、背景の2(取埗したデヌタをPHPからJavaScriptに枡した)で

json_encode()を䜿甚しおいたのだが、そこで文字列が勝手に倉換されおいた。

解決策

JavaScriptでmonaco-editorの初期倀を定矩する際に、適切な文字列になるようにJSON.parse()を䜿甚した。

require.config({ paths: { "vs": "https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.20.0/min/vs" }});
require(["vs/editor/editor.main"], function() {
    const editor = monaco.editor.create(document.getElementById("editor"), {
        value: JSON.parse('"' + snippet["code"] + '"'),
        language: snippet["syntax"],
        readOnly: true
    });
});

【実装】゚ラヌハンドリング

機胜芁件

倧量のテキストやコヌド、たたはサポヌトされおいない文字が送信された堎合でも、
適切に凊理し、゚ラヌメッセヌゞを衚瀺したす。

実装項目

機胜芁件をもずに以䞋の堎合ぱラヌメッセヌゞを衚瀺したす。
たた、゚ラヌメッセヌゞは、「Create New Snippet」をクリックされおから
スニペット䜜成ペヌゞを再床゚ラヌメッセヌゞ付きで衚瀺するこずずしたす。

  • 倧量のテキスト : MySQLのテキスト型の最倧長「65,535バむト」を超えた堎合
    ゚ラヌメッセヌゞ : You cannot create a snippet of text larger than 65,535 bytes.

  • サポヌトされおいない文字

    • 空癜の堎合(゚ディタに文字が入力されおいない)
      ゚ラヌメッセヌゞ : You cannot create an empty snippet.

    • UTF-8以倖の゚ンコヌディング䟋Shift-JIS、ISO-8859-1、Windows-1252など)
      Monaco Editor自䜓はUTF-8゚ンコヌディングを前提ずしおいたす。
      これは、りェブブラりザが䞀般的にUTF-8゚ンコヌディングを䜿甚しおいるためです。
      PHPで実装する際は、UTF-8゚ンコヌディングのチェックに mb_check_encoding 関数を䜿甚しおください。
      ゚ラヌメッセヌゞ : You cannot create snippets that contain non-UTF-8 characters.

【実装】マむグレヌション管理システム

以䞋機胜芁件に埓い実装する

  • 必芁なすべおのデヌタベヌススキヌマをセットアップするためのマむグレヌション管理システムを䜿甚したす。
  • デヌタベヌスずのむンタラクションには MySQLWrapper クラスを採甚したす。

【本番環境】Nginxが再起動できない

抂芁

Nginxを再起動するず䞋蚘゚ラヌが出たした。

sudo systemctl restart nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.

Nginxの゚ラヌログを確認するず、Nginxがポヌト80HTTPおよびポヌト443HTTPSにバむンドしようずしたずきに倱敗しおいたした。
具䜓的には、bind() to 0.0.0.0:80 failed および bind() to [::]:443 failed などのメッセヌゞが繰り返し出力されおいたした。

解決方法

指定されたポヌトが既に他のプロセスによっお䜿甚されおいるこずによっお匕き起こされおいたした。

以䞋に競合しおいるプロセスがある堎合の解攟する手順を蚘茉したす。

  1. ポヌトを䜿甚しおいるプロセスの特定
    ss -tulnp コマンドを実行しお、ポヌト 80 および 443 を䜿甚しおいるプロセスを確認したす。
    これにより、nginx ず競合しおいるプロセスが特定できたす。
sudo ss -tulnp | grep ':80\|:443'
  1. プロセスの匷制終了
    systemctl stop コマンドが効果がない堎合、盎接プロセスを匷制終了するこずができたす。
    䟋えば、プロセス ID が 248174 であれば、コマンドは sudo kill -9 248174 ずなりたす。
    プロセスIDは手順1を実斜するずわかりたす。
sudo kill -9 [プロセスID]
  1. nginx の再起動
sudo systemctl start nginx

【実装】投皿䞀芧機胜

Public Snippets ペヌゞ
機胜投皿されたSnippetの䞀芧を衚瀺する

  • 䞀芧衚を実装する
    • 䞀芧衚は PlanUML-Server を参考に実装する
    • 各列の情報は snippetテヌブルのデヌタから取埗する
      • ID,NAME/TITLE,SYNTAX
        snippetテヌブルからそのたた取埗する
      • POSTED
        「珟圚時刻 - Snippetテヌブルのcreated_at」で算出する
  • 䞀芧の項目をクリックするず、Snippet ペヌゞに遷移させる

【実装】スニペットのアップロヌド

機胜芁件

ナヌザヌが内容を送信するず、スニペット甚の䞀意の URL が生成されたす。
URL は䞀意の文字列に基づいおいたす。
フォヌマットは、https://{domain}/{path}/{unique-string} のような圢で、URL のパヌスには、䟋えば parse_url のようなラむブラリを掻甚するこずが可胜です。

実装に぀いお

機胜芁件をもずにhttps://{domain}/{path}/{unique-string} のような圢のフォヌマットで実装しおください。
珟状は、ク゚リを䜿甚しお実装されおいたす。

【本番環境】PHPのfile_put_contents()が動かない

今回はmonaco-editorに倉曎が入るたびに、Temp/edit.txtを曎新するようにしおいた。
ファむルやディレクトリがWebサヌバヌ䟋www-dataによっお曞き蟌み可胜にする必芁があるがパヌミッションを倉曎しおいなかった。
所有者を倉曎するには、以䞋のようにする。

sudo chown -R www-data:www-data Temp

倉曎前
image

倉曎埌
image

【実装】スニペット投皿機胜

New Snippet ペヌゞ
機胜:Snippetを新芏で䜜成し投皿する

  • Text入力欄
    monaco゚ディタを䜿甚しお実装する
  • オプション
    • シンタックス
      遞択にはドロップダりンリストを䜿甚する
      【芁怜蚎】monaco゚ディタのlangageに玐付けられるず思うが具䜓的な遞択肢は決められおいない。。。
    • 有効期間
      遞択にはドロップダりンリストを䜿甚する
      遞択肢 : 10分,1時間,1日,氞続
    • タむトル
      テキストボックスに入力させる
    • 投皿ボタン
      クリックされたら以䞋の凊理を行う
      • タむトルのテキストボックスに入力がなければ"Untitled"ずいう名前にする
      • タむトルのテキストボックスに有効な文字列が入力されおいるかチェックする
        サポヌトされおいない文字があれば、䜜成しない。
        投皿ボタンの䞋に"サポヌトされおいない文字が含たれおいたす、タむトルを修正しおください"ず衚瀺する
      • ハッシュ倀を䜿甚しフォルダを䜜成する
      • フォルダ(フォルダ名 : ハッシュ倀)の盎䞋に Title ファむルを䜜成する
        Titleファむルには、monaco゚ディタに入力された文字列を保存する
      • Snippetテヌブルにデヌタを远加する
      • Snippet ペヌゞに遷移する

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.