Storacle - ืื—ืกื•ืŸ ืงื‘ืฆื™ื ืžื‘ื•ื–ืจ

Storacle - ืื—ืกื•ืŸ ืงื‘ืฆื™ื ืžื‘ื•ื–ืจ

ืœืคื ื™ ืฉืื ื™ ืžืชื—ื™ืœ, ืื ื™ ื—ื™ื™ื‘ ืœืขื–ื•ื‘ ืงื™ืฉื•ืจ ืœืžืืžืจ ื”ืงื•ื“ืื›ื“ื™ ืฉื™ื”ื™ื” ื‘ืจื•ืจ ืขืœ ืžื” ื‘ื“ื™ื•ืง ืื ื—ื ื• ืžื“ื‘ืจื™ื.

ื‘ืžืืžืจ ื–ื” ื‘ืจืฆื•ื ื™ ืœื”ืกืชื›ืœ ืขืœ ื”ืฉื›ื‘ื” ื”ืื—ืจืื™ืช ืขืœ ืื—ืกื•ืŸ ืงื‘ืฆื™ื, ื•ื›ื™ืฆื“ ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื” ืขืœ ื™ื“ื™ ื›ืœ ืื—ื“. Storacle ื”ื™ื ืกืคืจื™ื™ื” ืขืฆืžืื™ืช, ืื™ืŸ ืงืฉืจ ื™ืฉื™ืจ ืœืžื•ื–ื™ืงื”. ืืชื” ื™ื›ื•ืœ ืœืืจื’ืŸ ืืช ื”ืื—ืกื•ืŸ ืฉืœ ื›ืœ ืงื‘ืฆื™ื.

ื‘ื›ืชื‘ื” ื”ืงื•ื“ืžืช, "ื’ืœื’ืœืชื™ ืืช ื”ื—ื‘ื™ืช" ืงืฆืช ื”ืœืื” ipfs, ืื‘ืœ ื–ื” ืงืจื” ื‘ื“ื™ื•ืง ื‘ื”ืงืฉืจ ืฉืœ ื”ื‘ืขื™ื” ืฉืคืชืจืชื™. ื‘ืกืš ื”ื›ืœ, ืื ื™ ื—ื•ืฉื‘ ืฉื”ืคืจื•ื™ืงื˜ ื”ื–ื” ืžื’ื ื™ื‘. ืื ื™ ืคืฉื•ื˜ ืžืขื“ื™ืฃ ืืช ื”ื™ื›ื•ืœืช ืœื™ืฆื•ืจ ืจืฉืชื•ืช ืฉื•ื ื•ืช ืœืžืฉื™ืžื•ืช ืฉื•ื ื•ืช. ื–ื” ืžืืคืฉืจ ืœืš ืœืืจื’ืŸ ื˜ื•ื‘ ื™ื•ืชืจ ืืช ื”ืžื‘ื ื” ื•ืœื”ืคื—ื™ืช ืืช ื”ืขื•ืžืก ืขืœ ืฆืžืชื™ื ื‘ื•ื“ื“ื™ื ื•ืขืœ ื”ืจืฉืช ื›ื•ืœื”. ื’ื ื‘ืžืกื’ืจืช ืฉืœ ืคืจื•ื™ืงื˜ ืื—ื“, ื‘ืžื™ื“ืช ื”ืฆื•ืจืš, ืืชื” ื™ื›ื•ืœ ืœืคืฆืœ ืืช ื”ืจืฉืช ืœืคื™ืกื•ืช ืœืคื™ ื›ืžื” ืงืจื™ื˜ืจื™ื•ื ื™ื, ืœื”ืคื—ื™ืช ืืช ื”ืขื•ืžืก ื”ื›ื•ืœืœ.

ืื– ืื—ืกื•ืŸ ืžืฉืชืžืฉ ื‘ืžื ื’ื ื•ืŸ ื ื™ืชืŸ ืœืžืจื™ื—ื” ืœืืจื’ื•ืŸ ืจืฉืช. ืชื›ื•ื ื•ืช ืขื™ืงืจื™ื•ืช:

  • ื ื™ืชืŸ ืœื”ื•ืกื™ืฃ ืงื‘ืฆื™ื ืœืžืื’ืจ ื“ืจืš ื›ืœ ืฆื•ืžืช.
  • ืงื‘ืฆื™ื ื ืฉืžืจื™ื ื‘ืžืœื•ืื, ืœื ื‘ื‘ืœื•ืงื™ื.
  • ืœื›ืœ ืงื•ื‘ืฅ ื™ืฉ ื’ื™ื‘ื•ื‘ ืชื•ื›ืŸ ื™ื™ื—ื•ื“ื™ ืžืฉืœื• ืœื”ืžืฉืš ืขื‘ื•ื“ื” ืื™ืชื•.
  • ื ื™ืชืŸ ืœืฉื›ืคืœ ืงื‘ืฆื™ื ืœืืžื™ื ื•ืช ืจื‘ื” ื™ื•ืชืจ
  • ืžืกืคืจ ื”ืงื‘ืฆื™ื ื‘ืฆื•ืžืช ืื—ื“ ืžื•ื’ื‘ืœ ืจืง ืขืœ ื™ื“ื™ ืžืขืจื›ืช ื”ืงื‘ืฆื™ื (ื™ืฉ ื—ืจื™ื’, ืขืœ ื›ืš ื‘ื”ืžืฉืš)
  • ืžืกืคืจ ื”ืงื‘ืฆื™ื ื‘ืจืฉืช ืžื•ื’ื‘ืœ ืขืœ ื™ื“ื™ ื”ื™ื›ื•ืœื•ืช ื”ื ื™ืชื ื•ืช ืœืคื™ื–ื•ืจ ืœืคื™ ืžืกืคืจ ื”ืฆืžืชื™ื ื”ืชืงืคื™ื ื‘ืจืฉืช, ืฉื‘ื’ืจืกื” ื”ืฉื ื™ื™ื” ื™ื•ื›ืœื• ืœืขื‘ื•ื“ ืขื ืื™ื ืกื•ืฃ ืฆืžืชื™ื (ืขื•ื“ ืขืœ ื›ืš ื‘ืžืืžืจ ืื—ืจ)

ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ืœืื™ืš ื–ื” ืขื•ื‘ื“ ื‘ื“ืจืš ื›ืœืœ ืžื”ืชื•ื›ื ื™ืช:

ืฉืจืช:

const  Node = require('storacle').Node;

(async () => {
  try {
    const node = new Node({
      port: 4000,
      hostname: 'localhost'
    });
    await node.init();
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

ืœึธืงื•ึผื—ึท:

const  Client = require('storacle').Client;

(async () => {
  try {
    const client = new  Client({
      address: 'localhost:4000'
    });
    await client.init();
    const hash = await client.storeFile('./my-file');
    const link = await client.getFileLink(hash); 
    await client.removeFile(hash);
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

ืžื‘ื˜ ืžื‘ืคื ื™ื

ืื™ืŸ ืฉื•ื ื“ื‘ืจ ืžืคื•ืืจ ืžืชื—ืช ืœืžื›ืกื” ื”ืžื ื•ืข. ืžื™ื“ืข ืขืœ ืžืกืคืจ ื”ืงื‘ืฆื™ื, ื’ื•ื“ืœื ื”ื›ื•ืœืœ ื•ื ืงื•ื“ื•ืช ื ื•ืกืคื•ืช ื ืฉืžืจ ื‘ืžืกื“ ื ืชื•ื ื™ื ื‘ื–ื™ื›ืจื•ืŸ ื•ืžืชืขื“ื›ืŸ ื›ืืฉืจ ืงื‘ืฆื™ื ื ืžื—ืงื™ื ื•ืžืชื•ื•ืกืคื™ื, ื›ืš ืฉืื™ืŸ ืฆื•ืจืš ื‘ื’ื™ืฉื” ืชื›ื•ืคื” ืœืžืขืจื›ืช ื”ืงื‘ืฆื™ื. ื™ื•ืฆื ืžืŸ ื”ื›ืœืœ ื”ื•ื ื”ืคืขืœืช ืื•ืกืฃ ื”ืืฉืคื” ื›ืืฉืจ ืืชื” ืฆืจื™ืš ืœื”ืคื™ืฅ ืงื‘ืฆื™ื ื›ืืฉืจ ืžื’ื™ืขื™ื ืœื’ื•ื“ืœ ืื—ืกื•ืŸ ืžืกื•ื™ื, ื•ืœื ืื•ืกืจื™ื ืขืœ ื”ื•ืกืคืช ืงื‘ืฆื™ื ื—ื“ืฉื™ื. ื‘ืžืงืจื” ื–ื”, ื™ืฉ ืœืขืงื•ืฃ ืืช ื”ืื—ืกื•ืŸ, ื•ืขื‘ื•ื“ื” ืขื ืžืกืคืจ ืจื‘ ืฉืœ ืงื‘ืฆื™ื (> ื ื’ื™ื“ ืžื™ืœื™ื•ืŸ) ืขืœื•ืœื” ืœื”ื•ื‘ื™ืœ ืœืขื•ืžืกื™ื ืžืฉืžืขื•ืชื™ื™ื. ื•ืขื“ื™ืฃ ืœืื—ืกืŸ ืคื—ื•ืช ืงื‘ืฆื™ื ื•ืœื”ืคืขื™ืœ ื™ื•ืชืจ ืฆืžืชื™ื. ืื ื”"ืžื ืงื”" ืžื•ืฉื‘ืช, ืื– ืื™ืŸ ื‘ืขื™ื” ื›ื–ื•.

ืื—ืกื•ืŸ ื”ืงื‘ืฆื™ื ืžื•ืจื›ื‘ ืž-256 ืชื™ืงื™ื•ืช ื•-2 ืจืžื•ืช ืฉืœ ืงื™ื ื•ืŸ. ืงื‘ืฆื™ื ืžืื•ื—ืกื ื™ื ื‘ืชื™ืงื™ื•ืช ื‘ืจืžื” ื”ืฉื ื™ื™ื”. ื›ืœื•ืžืจ, ืื ื™ืฉ ืžื™ืœื™ื•ืŸ. ื™ื”ื™ื• ื›-1 ืงื‘ืฆื™ื ื‘ื›ืœ ืชื™ืงื™ื” ื›ื–ื• (62500 / sqrt(1000000)).

ืฉืžื•ืช ื”ืชื™ืงื™ื•ืช ื ื•ืฆืจื™ื ืžื”-hash ืฉืœ ื”ืงื•ื‘ืฅ ื›ืš ืฉืชื•ื›ืœ ืœื’ืฉืช ืืœื™ื• ื‘ืžื”ื™ืจื•ืช ืื ืืชื” ืžื›ื™ืจ ืืช ื”-hash.

ืžื‘ื ื” ื–ื” ื ื‘ื—ืจ ืขืœ ืกืžืš ืžืกืคืจ ืจื‘ ืฉืœ ื“ืจื™ืฉื•ืช ืื—ืกื•ืŸ ืฉื•ื ื•ืช: ืชืžื™ื›ื” ื‘ืžืขืจื›ื•ืช ืงื‘ืฆื™ื ื—ืœืฉื•ืช, ื‘ื”ืŸ ืœื ืจืฆื•ื™ ืœื”ื—ื–ื™ืง ืงื‘ืฆื™ื ืจื‘ื™ื ื‘ืชื™ืงื™ื™ื” ืื—ืช, ืžืขื‘ืจ ืžื”ื™ืจ ืฉืœ ื›ืœ ื”ืชื™ืงื™ื•ืช ื‘ืžื™ื“ืช ื”ืฆื•ืจืš ื•ื›ื•'. ืกื•ื’ ืฉืœ ืืžืฆืขื™ ื–ื”ื‘.

ืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ

ื‘ืขืช ื”ื•ืกืคืช ืงื‘ืฆื™ื, ื›ืžื• ื’ื ื‘ืขืช ืงื‘ืœืชื, ื ื›ืชื‘ื™ื ืงื™ืฉื•ืจื™ื ืœืงื‘ืฆื™ื ืœืžื˜ืžื•ืŸ.
ื”ื•ื“ื•ืช ืœื›ืš, ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืžืื•ื“ ืื™ืŸ ืฆื•ืจืš ืœื—ืฆื•ืช ืืช ื›ืœ ื”ืจืฉืช ื‘ื—ื™ืคื•ืฉ ืื—ืจ ืงื•ื‘ืฅ. ื–ื” ืžืื™ืฅ ืืช ืงื‘ืœืช ื”ืงื™ืฉื•ืจื™ื ื•ืžืคื—ื™ืช ืืช ื”ืขื•ืžืก ืขืœ ื”ืจืฉืช. ืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ ืžืชืจื—ืฉืช ื’ื ื‘ืืžืฆืขื•ืช ื›ื•ืชืจื•ืช http.

ืื™ื–ื•ืžื•ืจืคื™ื”

ื”ืœืงื•ื— ื›ืชื•ื‘ ื‘-javascript ื•ื”ื•ื ืื™ื–ื•ืžื•ืจืคื™, ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื™ืฉื™ืจื•ืช ืžื”ื“ืคื“ืคืŸ. 
ืืชื” ื™ื›ื•ืœ ืœื”ืขืœื•ืช ืืช ื”ืงื•ื‘ืฅ https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js ื›ืชืกืจื™ื˜ ื•ื’ื™ืฉื” window.ClientStoracle ืื• ืœื™ื™ื‘ื ื“ืจืš ืžืขืจื›ืช ื”ื‘ื ื™ื™ื” ื•ื›ื•'.

ืงื™ืฉื•ืจื™ื ื“ื—ื•ื™ื™ื

ืชื›ื•ื ื” ืžืขื ื™ื™ื ืช ื”ื™ื ื’ื "ื”ืชื™ื™ื—ืกื•ืช ื ื“ื—ื™ืช". ื–ื”ื• ืงื™ืฉื•ืจ ืœืงื•ื‘ืฅ ืฉื ื™ืชืŸ ืœื”ืฉื™ื’ ื‘ืื•ืคืŸ ืกื™ื ื›ืจื•ื ื™, ื›ืืŸ ื•ืขื›ืฉื™ื•, ื•ื”ืงื•ื‘ืฅ ื™ื™ืžืฉืš ื›ืฉื”ื•ื ื›ื‘ืจ ื ืžืฆื ื‘ืื—ืกื•ืŸ. ื–ื” ืžืื•ื“ ื ื•ื— ื›ืืฉืจ, ืœืžืฉืœ, ืืชื” ืฆืจื™ืš ืœื”ืฆื™ื’ ื›ืžื” ืชืžื•ื ื•ืช ื‘ืืชืจ. ืคืฉื•ื˜ ืฉืžื ื• ืงื™ืฉื•ืจ ื“ื—ื•ื™ ื‘-src ื•ื–ื”ื•. ืืชื” ื™ื›ื•ืœ ืœื”ืขืœื•ืช ืžืงืจื™ื ืจื‘ื™ื.

ืœืงื•ื— API

  • ืืกื™ื ื›ืจื•ื ื™ Client.prototype.storeFile() - ืฉืžื™ืจืช ื”ืงื•ื‘ืฅ
  • ืืกื™ื ื›ืจื•ื ื™ Client.prototype.getFileLink() - ืงื‘ืœืช ืงื™ืฉื•ืจ ื™ืฉื™ืจ ืœืงื•ื‘ืฅ
  • ืืกื™ื ื›ืจื•ื ื™ Client.prototype.getFileLinks() - ืงื‘ืœืช ืจืฉื™ืžื” ืฉืœ ืงื™ืฉื•ืจื™ื ื™ืฉื™ืจื™ื ืœืงื•ื‘ืฅ ืžื›ืœ ื”ืฆืžืชื™ื ืฉื‘ื”ื ื”ื•ื ืงื™ื™ื
  • ืืกื™ื ื›ืจื•ื ื™ Client.prototype.getFileToBuffer() - ื”ื›ื ืก ืืช ื”ืงื•ื‘ืฅ ืœืžืื’ืจ
  • ืืกื™ื ื›ืจื•ื ื™ Client.prototype.getFileToPath() - ื”ื›ื ืก ืงื•ื‘ืฅ ืœืžืขืจื›ืช ื”ืงื‘ืฆื™ื
  • ืืกื™ื ื›ืจื•ื ื™ Client.prototype.getFileToBlob() - ืงื‘ืœ ืืช ื”ืงื•ื‘ืฅ ื‘-blob (ืขื‘ื•ืจ ื’ืจืกืช ื”ื“ืคื“ืคืŸ)
  • ืืกื™ื ื›ืจื•ื ื™ Client.prototype.removeFile() - ืœืžื—ื•ืง ืงื•ื‘ืฅ
  • Client.prototype.createRequestedFileLink() - ืฆื•ืจ ืงื™ืฉื•ืจ ื“ื—ื•ื™

ื™ื™ืฆื ืงื‘ืฆื™ื ืœืฉืจืช ืื—ืจ

ื›ื“ื™ ืœื”ืขื‘ื™ืจ ืงื‘ืฆื™ื ืœืฆื•ืžืช ืื—ืจ, ืืชื” ื™ื›ื•ืœ:

  • ืคืฉื•ื˜ ื”ืขืชืง ืืช ื›ืœ ืชื™ืงื™ื™ืช ื”ืื—ืกื•ืŸ ื™ื—ื“ ืขื ื”ื”ื’ื“ืจื•ืช. (ื™ื™ืชื›ืŸ ืฉื–ื” ืœื ื™ืขื‘ื•ื“ ื‘ืขืชื™ื“)
  • ื”ืขืชืง ืจืง ืืช ื”ืชื™ืงื™ื” ืขื ื”ืงื‘ืฆื™ื. ืื‘ืœ, ื‘ืžืงืจื” ื–ื”, ืชืฆื˜ืจืš ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” ืคืขื ืื—ืช node.normalizeFilesInfo()ืœื—ืฉื‘ ืžื—ื“ืฉ ืืช ื›ืœ ื”ื ืชื•ื ื™ื ื•ืœื”ื–ื™ืŸ ืื•ืชื ืœืžืกื“ ื”ื ืชื•ื ื™ื.
  • ื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” node.exportFiles()ืืฉืจ ื™ืชื—ื™ืœ ืœื”ืขืชื™ืง ืงื‘ืฆื™ื.

ื”ื’ื“ืจื•ืช ืฆื•ืžืช ื‘ืกื™ืกื™ื•ืช
ื‘ืขืช ื”ืคืขืœืช ืฆื•ืžืช ื”ืื—ืกื•ืŸ, ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ ืืช ื›ืœ ื”ื”ื’ื“ืจื•ืช ื”ื“ืจื•ืฉื•ืช.
ืืชืืจ ืืช ื”ื‘ืกื™ืกื™ื™ื ื‘ื™ื•ืชืจ, ืืช ื”ืฉืืจ ื ื™ืชืŸ ืœืžืฆื•ื ื‘-Github.

  • storage.dataSize - ื’ื•ื“ืœ ื”ืชื™ืงื™ื” ืขื ื”ืงื‘ืฆื™ื
  • storage.tempSize - ื’ื•ื“ืœ ืชื™ืงื™ื™ื” ื–ืžื ื™
  • storage.autoCleanSize - ื’ื•ื“ืœ ื”ืื—ืกื•ืŸ ื”ืžื™ื ื™ืžืœื™ ืฉืฆืจื™ืš ืœื”ื—ื–ื™ืง. ืื ืชืฆื™ื™ืŸ ืืช ื”ืคืจืžื˜ืจ ื”ื–ื”, ื‘ืจื’ืข ืฉื”ืฉื˜ื— ื™ืชื—ื™ืœ ืœื”ื™ื’ืžืจ, ื”ืงื‘ืฆื™ื ื”ื›ื™ ืคื—ื•ืช ื‘ืฉื™ืžื•ืฉ ื™ื™ืžื—ืงื•.
  • file.maxSize - ื’ื•ื“ืœ ืงื•ื‘ืฅ ืžืงืกื™ืžืœื™
  • file.minSize - ื’ื•ื“ืœ ืงื•ื‘ืฅ ืžื™ื ื™ืžืœื™
  • file.preferredDuplicates - ืžืกืคืจ ืžื•ืขื“ืฃ ืฉืœ ื›ืคื™ืœื•ื™ื•ืช ืงื‘ืฆื™ื ื‘ืจืฉืช
  • ื”ืจืฉื™ืžื” ื”ืœื‘ื ื” ืฉืœ file.mime - ืกื•ื’ื™ ืงื‘ืฆื™ื ื—ื•ืงื™ื™ื
  • file.mime ืจืฉื™ืžื” ืฉื—ื•ืจื” - ืกื•ื’ื™ ืงื‘ืฆื™ื ืœื ื—ื•ืงื™ื™ื
  • file.extWhitelist - ืกื™ื•ืžื•ืช ืงื‘ืฆื™ื ื—ื•ืงื™ื•ืช
  • file.extBlacklist - ืกื™ื•ืžื•ืช ืงื‘ืฆื™ื ืœื ื—ื•ืงื™ื•ืช
  • file.linkCache - ื”ื’ื“ืจื•ืช ืฉื•ื ื•ืช ืฉืœ ืื—ืกื•ืŸ ื‘ืžื˜ืžื•ืŸ ืงื™ืฉื•ืจื™ื

ื ื™ืชืŸ ืœื”ื–ื™ืŸ ื›ืžืขื˜ ืืช ื›ืœ ื”ืคืจืžื˜ืจื™ื ื”ืงืฉื•ืจื™ื ืœืžืžื“ื™ื ื”ืŸ ื‘ืขืจื›ื™ื ืžื•ื—ืœื˜ื™ื ื•ื”ืŸ ื‘ืขืจื›ื™ื ื™ื—ืกื™ื™ื.

ืขื‘ื•ื“ื” ื“ืจืš ืฉื•ืจืช ื”ืคืงื•ื“ื”
ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ื” ื‘ืืžืฆืขื•ืช ืฉื•ืจืช ื”ืคืงื•ื“ื”. ืœืฉื ื›ืš ืขืœื™ืš ืœื”ืชืงื™ืŸ ืื•ืชื• ื‘ืจื—ื‘ื™ ื”ืขื•ืœื: npm i -g ืื—ืกื•ืŸ. ืœืื—ืจ ืžื›ืŸ, ืชื•ื›ืœ ืœื”ืคืขื™ืœ ืืช ื”ืคืขื•ืœื•ืช ื”ื“ืจื•ืฉื•ืช ืžืกืคืจื™ื™ืช ื”ืคืจื•ื™ืงื˜ ืฉื‘ื” ื ืžืฆื ื”ืฆื•ืžืช. ืœื“ื•ื’ืžื”, storacle -a storeFile -f ./file.txt -c ./config.jsื›ื“ื™ ืœื”ื•ืกื™ืฃ ืืช ื”ืงื•ื‘ืฅ. ื ื™ืชืŸ ืœืžืฆื•ื ืืช ื›ืœ ื”ืคืขื•ืœื•ืช ื‘ https://github.com/ortexx/storacle/blob/master/bin/actions.js

ืœืžื” ืื•ืœื™ ืชืฆื˜ืจืš ืืช ื–ื”?

  • ืื ืืชื” ืจื•ืฆื” ืœื™ืฆื•ืจ ืื™ื–ืฉื”ื• ืคืจื•ื™ืงื˜ ืžื‘ื•ื–ืจ ืฉื‘ื• ืืชื” ืžืชื›ื ืŸ ืœืื—ืกืŸ ื•ืœืขื‘ื•ื“ ืขื ืงื‘ืฆื™ื ื‘ืฉื™ื˜ื•ืช ื ื•ื—ื•ืช. ืœื“ื•ื’ืžื”, ืคืจื•ื™ืงื˜ ื”ืžื•ื–ื™ืงื” ื”ืžืชื•ืืจ ื‘ืงื™ืฉื•ืจ ื‘ืชื—ื™ืœืช ื”ืžืืžืจ ืžืฉืชืžืฉ ืžื—ืกืŸ.
  • ืื ืืชื” ืขื•ื‘ื“ ืขืœ ื›ืœ ืคืจื•ื™ืงื˜ ืื—ืจ ืฉื‘ื• ืืชื” ืฆืจื™ืš ืœืื—ืกืŸ ืงื‘ืฆื™ื ื‘ืฆื•ืจื” ืžื‘ื•ื–ืจืช. ืืชื” ื™ื›ื•ืœ ื‘ืงืœื•ืช ืœื‘ื ื•ืช ืืช ื”ืจืฉืช ื”ืกื’ื•ืจื” ืฉืœืš, ืœื”ื’ื“ื™ืจ ืฆืžืชื™ื ื‘ืื•ืคืŸ ื’ืžื™ืฉ ื•ืœื”ื•ืกื™ืฃ ื—ื“ืฉื™ื ื‘ืขืช ื”ืฆื•ืจืš.
  • ืื ืืชื” ืจืง ืฆืจื™ืš ืœืื—ืกืŸ ืืช ืงื‘ืฆื™ ื”ืืชืจ ืฉืœืš ืื™ืคืฉื”ื• ื•ื–ื” ื™ื•ืชืจ ืžื“ื™ ื‘ืฉื‘ื™ืœืš ืœื›ืชื•ื‘ ื”ื›ืœ ื‘ืขืฆืžืš. ืื•ืœื™ ืกืคืจื™ื™ื” ื–ื• ืžืชืื™ืžื” ื™ื•ืชืจ ืžืื—ืจื•ืช ื‘ืžืงืจื” ืฉืœืš.
  • ืื ื™ืฉ ืœืš ืคืจื•ื™ืงื˜ ืฉื‘ื• ืืชื” ืขื•ื‘ื“ ืขื ืงื‘ืฆื™ื, ืื‘ืœ ืจื•ืฆื” ืœื‘ืฆืข ืืช ื›ืœ ื”ืžื ื™ืคื•ืœืฆื™ื•ืช ืžื”ื“ืคื“ืคืŸ. ืืชื” ื™ื›ื•ืœ ืœื”ื™ืžื ืข ืžื›ืชื™ื‘ืช ืงื•ื“ ืฉืจืช.

ืื ืฉื™ ื”ืงืฉืจ ืฉืœื™:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”