ஃபாஸ்டில் பின்னணி பணிகள், பகுதி II: முகவர்கள் மற்றும் அணிகள்

ஃபாஸ்டில் பின்னணி பணிகள், பகுதி II: முகவர்கள் மற்றும் அணிகள்

உள்ளடக்க அட்டவணை

  1. பகுதி I: அறிமுகம்

  2. பகுதி II: முகவர்கள் மற்றும் குழுக்கள்

நாம் இங்கே என்ன செய்கிறோம்?

எனவே, இரண்டாவது பகுதி. முன்பு எழுதப்பட்டபடி, அதில் நாம் பின்வருவனவற்றைச் செய்வோம்:

  1. நமக்குத் தேவையான இறுதிப்புள்ளிகளுக்கான கோரிக்கைகளுடன் aiohttp இல் alphavantageக்காக ஒரு சிறிய கிளையண்டை எழுதுவோம்.

  2. பத்திரங்கள் மற்றும் மெட்டா தகவல்கள் பற்றிய தரவுகளை சேகரிக்கும் ஒரு முகவரை உருவாக்குவோம்.

ஆனால், திட்டத்திற்காக இதைத்தான் செய்வோம், மேலும் விரைவான ஆராய்ச்சியின் அடிப்படையில், காஃப்காவிலிருந்து ஸ்ட்ரீம் நிகழ்வுகளை செயலாக்கும் முகவர்களை எவ்வாறு எழுதுவது, அதே போல் கட்டளைகளை எவ்வாறு எழுதுவது (ரேப்பரைக் கிளிக் செய்வது) என்பதை நாங்கள் கற்றுக்கொள்வோம் - முகவர் கண்காணிக்கும் தலைப்புக்கான கைமுறை புஷ் செய்திகளுக்கு.

பயிற்சி

AlphaVantage கிளையண்ட்

முதலில், எழுத்துக்களுக்கான கோரிக்கைகளுக்கு ஒரு சிறிய aiohttp கிளையண்டை எழுதுவோம்.

alphavantage.py

ஸ்பாய்லர்

import urllib.parse as urlparse
from io import StringIO
from typing import Any, Dict, List, Union

import aiohttp
import pandas as pd
import stringcase
from loguru import logger

from horton.config import API_ENDPOINT


class AlphaVantageClient:
    def __init__(
        self,
        session: aiohttp.ClientSession,
        api_key: str,
        api_endpoint: str = API_ENDPOINT,
    ):
        self._query_params = {"datatype": "json", "apikey": api_key}
        self._api_endpoint = api_endpoint
        self._session = session

    @logger.catch
    def _format_fields(self, data: Dict[str, Any]) -> Dict[str, Any]:
        formatted_data = {}

        for field, item in data.items():
            formatted_data[stringcase.snakecase(field)] = item

        return formatted_data

    @logger.catch
    async def _construct_query(
        self, function: str, to_json: bool = True, **kwargs
    ) -> Union[Dict[str, Any], str]:
        path = "query/"

        async with self._session.get(
            urlparse.urljoin(self._api_endpoint, path),
            params={"function": function, **kwargs, **self._query_params},
        ) as response:
            data = (await response.json()) if to_json else (await response.text())

            if to_json:
                data = self._format_fields(data)

        return data

    @logger.catch
    async def get_securities(self, state: str = "active") -> List[Dict[str, str]]:
        data = await self._construct_query("LISTING_STATUS", state=state, to_json=False)

        data = pd.read_csv(StringIO(data))

        securities = data.to_dict("records")

        for index, security in enumerate(securities):
            security = self._format_fields(security)
            security["_type"] = "physical"

            securities[index] = security

        return securities

    @logger.catch
    async def get_security_overview(self, symbol: str) -> Dict[str, str]:
        return await self._construct_query("OVERVIEW", symbol=symbol)

    @logger.catch
    async def get_historical_data(self, symbol: str) -> Dict[str, Any]:
        return await self._construct_query(
            "TIME_SERIES_DAILY_ADJUSTED", symbol=symbol, outputsize="full"
        )

    @logger.catch
    async def get_last_price_data(self, symbol: str) -> Dict[str, Any]:
        return await self._construct_query("GLOBAL_QUOTE", symbol=symbol)

    @logger.catch
    async def get_indicator_data(
        self, symbol: str, indicator: str, **indicator_options
    ) -> Dict[str, Any]:
        return await self._construct_query(
            indicator, symbol=symbol, **indicator_options
        )

உண்மையில், அதிலிருந்து எல்லாம் தெளிவாக உள்ளது:

  1. AlphaVantage API மிகவும் எளிமையாகவும் அழகாகவும் வடிவமைக்கப்பட்டுள்ளது, எனவே அனைத்து கோரிக்கைகளையும் முறை மூலம் செய்ய முடிவு செய்தேன் construct_query இதையொட்டி ஒரு http அழைப்பு உள்ளது.

  2. நான் எல்லா துறைகளையும் கொண்டு வருகிறேன் snake_case வசதிக்காக.

  3. சரி, அழகான மற்றும் தகவலறிந்த ட்ரேஸ்பேக் வெளியீட்டிற்கான logger.catch அலங்காரம்.

PS config.yml க்கு உள்நாட்டில் அல்ஃபாவாண்டேஜ் டோக்கனைச் சேர்க்க அல்லது சூழல் மாறியை ஏற்றுமதி செய்ய மறக்காதீர்கள் HORTON_SERVICE_APIKEY. நாங்கள் ஒரு டோக்கனைப் பெறுகிறோம் இங்கே.

CRUD வகுப்பு

பத்திரங்கள் பற்றிய மெட்டா தகவல்களைச் சேமிப்பதற்காக எங்களிடம் ஒரு பத்திர சேகரிப்பு இருக்கும்.

தரவுத்தளம்/security.py

என் கருத்துப்படி, இங்கே எதையும் விளக்க வேண்டிய அவசியமில்லை, அடிப்படை வகுப்பே மிகவும் எளிமையானது.

get_app()

பயன்பாட்டு பொருளை உருவாக்குவதற்கான செயல்பாட்டைச் சேர்ப்போம் app.py

ஸ்பாய்லர்

import faust

from horton.config import KAFKA_BROKERS


def get_app():
    return faust.App("horton", broker=KAFKA_BROKERS)

இப்போதைக்கு எங்களிடம் எளிமையான பயன்பாட்டு உருவாக்கம் இருக்கும், சிறிது நேரம் கழித்து அதை விரிவுபடுத்துவோம், இருப்பினும், நீங்கள் காத்திருக்காமல் இருக்க, இங்கே குறிப்புகள் ஆப்-வகுப்புக்கு. அமைப்புகள் வகுப்பைப் பார்க்கவும் நான் உங்களுக்கு அறிவுறுத்துகிறேன், ஏனெனில் இது பெரும்பாலான அமைப்புகளுக்கு பொறுப்பாகும்.

முக்கிய பகுதி

பத்திரங்களின் பட்டியலை சேகரித்து பராமரிப்பதற்கான முகவர்

app = get_app()

collect_securities_topic = app.topic("collect_securities", internal=True)

@app.agent(collect_securities_topic)
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
	pass

எனவே, முதலில் நாம் வேகமான பயன்பாட்டு பொருளைப் பெறுகிறோம் - இது மிகவும் எளிது. அடுத்து, எங்கள் முகவருக்கு ஒரு தலைப்பை நாங்கள் வெளிப்படையாக அறிவிக்கிறோம்... இங்கே அது என்ன, உள் அளவுரு என்ன, இதை எப்படி வித்தியாசமாக ஏற்பாடு செய்யலாம் என்பதைக் குறிப்பிடுவது மதிப்பு.

  1. காஃப்காவில் உள்ள தலைப்புகள், சரியான வரையறையை அறிய விரும்பினால், படிப்பது நல்லது ஆஃப். ஆவணம், அல்லது நீங்கள் படிக்கலாம் சுருக்கம் ரஷ்ய மொழியில் ஹப்ரேயில், எல்லாம் மிகவும் துல்லியமாக பிரதிபலிக்கிறது :)

  2. அளவுரு உள், ஃபாஸ்ட் டாக்கில் நன்றாக விவரிக்கப்பட்டுள்ளது, தலைப்பை நேரடியாக குறியீட்டில் உள்ளமைக்க அனுமதிக்கிறது, நிச்சயமாக, இதன் பொருள் ஃபாஸ்ட் டெவலப்பர்கள் வழங்கிய அளவுருக்கள், எடுத்துக்காட்டாக: தக்கவைத்தல், தக்கவைத்தல் கொள்கை (இயல்புநிலையாக நீக்குதல், ஆனால் நீங்கள் அமைக்கலாம் கச்சிதமான), ஒரு தலைப்பிற்கான பகிர்வுகளின் எண்ணிக்கை (பகிர்வுகளைசெய்ய, எடுத்துக்காட்டாக, குறைவாக உலகளாவிய முக்கியத்துவம் பயன்பாடுகள் வேகமாக).

  3. பொதுவாக, முகவர் உலகளாவிய மதிப்புகளுடன் நிர்வகிக்கப்பட்ட தலைப்பை உருவாக்க முடியும், இருப்பினும், எல்லாவற்றையும் வெளிப்படையாக அறிவிக்க விரும்புகிறேன். கூடுதலாக, முகவர் விளம்பரத்தில் உள்ள தலைப்பின் சில அளவுருக்கள் (உதாரணமாக, பகிர்வுகளின் எண்ணிக்கை அல்லது தக்கவைப்பு கொள்கை) உள்ளமைக்க முடியாது.

    தலைப்பை கைமுறையாக வரையறுக்காமல் இது எப்படி இருக்கும் என்பது இங்கே:

app = get_app()

@app.agent()
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
	pass

சரி, இப்போது எங்கள் முகவர் என்ன செய்வார் என்பதை விவரிப்போம் :)

app = get_app()

collect_securities_topic = app.topic("collect_securities", internal=True)

@app.agent(collect_securities_topic)
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
    async with aiohttp.ClientSession() as session:
        async for _ in stream:
            logger.info("Start collect securities")

            client = AlphaVantageClient(session, API_KEY)

            securities = await client.get_securities()

            for security in securities:
                await SecurityCRUD.update_one(
                    {"symbol": security["symbol"], "exchange": security["exchange"]}, security, upsert=True
                )

            yield True

எனவே, முகவரின் தொடக்கத்தில், எங்கள் கிளையன்ட் மூலம் கோரிக்கைகளுக்காக aiohttp அமர்வைத் திறக்கிறோம். எனவே, ஒரு தொழிலாளியைத் தொடங்கும் போது, ​​எங்கள் முகவர் தொடங்கப்பட்டவுடன், ஒரு அமர்வு உடனடியாகத் திறக்கப்படும் - ஒன்று, முழு நேரமும் தொழிலாளி இயங்கும் (அல்லது பல, நீங்கள் அளவுருவை மாற்றினால் ஒருங்கிணைவு இயல்புநிலை அலகு கொண்ட ஒரு முகவரிடமிருந்து).

அடுத்து, நாங்கள் ஸ்ட்ரீமைப் பின்தொடர்கிறோம் (செய்தியை உள்ளே வைக்கிறோம் _, இந்த ஏஜெண்டில் நாங்கள், எங்கள் தலைப்பில் இருந்து வரும் செய்திகளின் உள்ளடக்கத்தைப் பற்றி கவலைப்படுவதில்லை என்பதால், அவை தற்போதைய ஆஃப்செட்டில் இருந்தால், இல்லையெனில் எங்கள் சுழற்சி அவற்றின் வருகைக்காக காத்திருக்கும். சரி, எங்கள் லூப்பில், நாங்கள் செய்தியின் ரசீதை பதிவுசெய்து, செயலில் உள்ள (get_securities இயல்புநிலையாக மட்டுமே செயல்படும், கிளையன்ட் குறியீட்டைப் பார்க்கவும்) பத்திரங்களின் பட்டியலைப் பெற்று, தரவுத்தளத்தில் சேமித்து, அதே டிக்கர் மற்றும் பாதுகாப்பு உள்ளதா எனச் சரிபார்ப்போம். தரவுத்தளத்தில் பரிமாற்றம் , இருந்தால், அது (தாள்) வெறுமனே புதுப்பிக்கப்படும்.

எங்கள் படைப்பைத் தொடங்குவோம்!

> docker-compose up -d
... Запуск контейнеров ...
> faust -A horton.agents worker --without-web -l info

PS அம்சங்கள் வலை கூறு நான் கட்டுரைகளில் ஃபாஸ்டைக் கருத்தில் கொள்ள மாட்டேன், எனவே நாங்கள் பொருத்தமான கொடியை அமைக்கிறோம்.

எங்கள் வெளியீட்டு கட்டளையில், பயன்பாட்டு பொருளை எங்கு தேடுவது மற்றும் அதை என்ன செய்வது (ஒரு பணியாளரை துவக்கவும்) தகவல் பதிவு வெளியீட்டு நிலையுடன் ஃபாஸ்டுக்கு கூறினோம். பின்வரும் வெளியீட்டைப் பெறுகிறோம்:

ஸ்பாய்லர்

┌ƒaµS† v1.10.4┬───────────────────────────────────────────────────┐
│ id          │ horton                                            │
│ transport   │ [URL('kafka://localhost:9092')]                   │
│ store       │ memory:                                           │
│ log         │ -stderr- (info)                                   │
│ pid         │ 1271262                                           │
│ hostname    │ host-name                                         │
│ platform    │ CPython 3.8.2 (Linux x86_64)                      │
│ drivers     │                                                   │
│   transport │ aiokafka=1.1.6                                    │
│   web       │ aiohttp=3.6.2                                     │
│ datadir     │ /path/to/project/horton-data                      │
│ appdir      │ /path/to/project/horton-data/v1                   │
└─────────────┴───────────────────────────────────────────────────┘
... логи, логи, логи ...

┌Topic Partition Set─────────┬────────────┐
│ topic                      │ partitions │
├────────────────────────────┼────────────┤
│ collect_securities         │ {0-7}      │
│ horton-__assignor-__leader │ {0}        │
└────────────────────────────┴────────────┘ 

அது உயிருடன் உள்ளது!!!

பகிர்வு தொகுப்பைப் பார்ப்போம். நாம் பார்க்கிறபடி, குறியீட்டில் நாம் நியமித்த பெயருடன் ஒரு தலைப்பு உருவாக்கப்பட்டது, பகிர்வுகளின் இயல்புநிலை எண் (8, எடுக்கப்பட்டது தலைப்பு_பகிர்வுகள் - பயன்பாட்டு பொருள் அளவுரு), எங்கள் தலைப்புக்கான தனிப்பட்ட மதிப்பை நாங்கள் குறிப்பிடவில்லை (பகிர்வுகள் வழியாக). தொழிலாளியில் தொடங்கப்பட்ட முகவருக்கு அனைத்து 8 பகிர்வுகளும் ஒதுக்கப்பட்டுள்ளன, ஏனெனில் இது ஒரே ஒன்றாகும், ஆனால் இது கிளஸ்டரிங் பற்றிய பகுதியில் விரிவாக விவாதிக்கப்படும்.

சரி, இப்போது நாம் மற்றொரு முனைய சாளரத்திற்குச் சென்று எங்கள் தலைப்புக்கு ஒரு வெற்று செய்தியை அனுப்பலாம்:

> faust -A horton.agents send @collect_securities
{"topic": "collect_securities", "partition": 6, "topic_partition": ["collect_securities", 6], "offset": 0, "timestamp": ..., "timestamp_type": 0}

PS ஐப் பயன்படுத்துகிறது @ "collect_securities" என்ற தலைப்புக்கு நாங்கள் ஒரு செய்தியை அனுப்புகிறோம் என்பதைக் காட்டுகிறோம்.

இந்த வழக்கில், செய்தி பகிர்வு 6 க்கு சென்றது - நீங்கள் kafdrop இல் சென்று இதை சரிபார்க்கலாம் localhost:9000

எங்கள் பணியாளருடன் முனைய சாளரத்திற்குச் சென்றால், லோகுருவைப் பயன்படுத்தி அனுப்பப்பட்ட மகிழ்ச்சியான செய்தியைக் காண்போம்:

2020-09-23 00:26:37.304 | INFO     | horton.agents:collect_securities:40 - Start collect securities

நாம் மோங்கோவை (Robo3T அல்லது Studio3T ஐப் பயன்படுத்தி) பார்க்கலாம் மற்றும் பத்திரங்கள் தரவுத்தளத்தில் இருப்பதைப் பார்க்கலாம்:

நான் ஒரு பில்லியனர் அல்ல, எனவே முதல் பார்வை விருப்பத்தில் நாங்கள் திருப்தி அடைகிறோம்.

ஃபாஸ்டில் பின்னணி பணிகள், பகுதி II: முகவர்கள் மற்றும் அணிகள்ஃபாஸ்டில் பின்னணி பணிகள், பகுதி II: முகவர்கள் மற்றும் அணிகள்

மகிழ்ச்சி மற்றும் மகிழ்ச்சி - முதல் முகவர் தயாராக உள்ளது :)

முகவர் தயார், புதிய முகவர் வாழ்க!

ஆம், தாய்மார்களே, இந்த கட்டுரையில் தயாரிக்கப்பட்ட பாதையின் 1/3 பகுதியை மட்டுமே நாங்கள் உள்ளடக்கியுள்ளோம், ஆனால் சோர்வடைய வேண்டாம், ஏனென்றால் இப்போது அது எளிதாக இருக்கும்.

எனவே இப்போது நமக்கு மெட்டா தகவலைச் சேகரித்து சேகரிப்பு ஆவணத்தில் வைக்கும் முகவர் தேவை:

collect_security_overview_topic = app.topic("collect_security_overview", internal=True)


@app.agent(collect_security_overview_topic)
async def collect_security_overview(
    stream: StreamT[?],
) -> AsyncIterable[bool]:
    async with aiohttp.ClientSession() as session:
        async for event in stream:
            ...

இந்த ஏஜென்ட் ஒரு குறிப்பிட்ட பாதுகாப்பைப் பற்றிய தகவலைச் செயலாக்கும் என்பதால், இந்தச் செய்தியில் இந்தப் பாதுகாப்பின் டிக்கரை (சின்னத்தை) குறிப்பிட வேண்டும். ஃபாஸ்ட் இந்த நோக்கத்திற்காக உள்ளன ரெக்கார்ட்ஸ் - முகவர் தலைப்பில் செய்தித் திட்டத்தை அறிவிக்கும் வகுப்புகள்.

இந்த வழக்கில், நாம் செல்லலாம் பதிவுகள்.py இந்த தலைப்புக்கான செய்தி எப்படி இருக்க வேண்டும் என்பதை விவரிக்கவும்:

import faust


class CollectSecurityOverview(faust.Record):
    symbol: str
    exchange: str

நீங்கள் யூகித்துள்ளபடி, செய்தித் திட்டத்தை விவரிக்க ஃபாஸ்ட் பைதான் வகை சிறுகுறிப்பைப் பயன்படுத்துகிறது, அதனால்தான் நூலகத்தால் ஆதரிக்கப்படும் குறைந்தபட்ச பதிப்பு 3.6.

முகவருக்குத் திரும்புவோம், வகைகளை அமைத்து அதைச் சேர்ப்போம்:

collect_security_overview_topic = app.topic(
    "collect_security_overview", internal=True, value_type=CollectSecurityOverview
)


@app.agent(collect_security_overview_topic)
async def collect_security_overview(
    stream: StreamT[CollectSecurityOverview],
) -> AsyncIterable[bool]:
    async with aiohttp.ClientSession() as session:
        async for event in stream:
            logger.info(
                "Start collect security [{symbol}] overview", symbol=event.symbol
            )

            client = AlphaVantageClient(session, API_KEY)

            security_overview = await client.get_security_overview(event.symbol)

            await SecurityCRUD.update_one({"symbol": event.symbol, "exchange": event.exchange}, security_overview)

            yield True

நீங்கள் பார்க்கிறபடி, தலைப்பு துவக்க முறை - value_typeக்கு ஒரு புதிய அளவுருவை ஒரு திட்டத்துடன் அனுப்புகிறோம். மேலும், எல்லாமே ஒரே திட்டத்தைப் பின்பற்றுகின்றன, எனவே வேறு எதிலும் கவனம் செலுத்துவதில் எந்த அர்த்தமும் இல்லை.

இறுதியாக, சேகரிக்க_செக்யூரிட்டிகளுக்கு மெட்டா தகவல் சேகரிப்பு முகவருக்கு அழைப்பைச் சேர்ப்பதாகும்:

....
for security in securities:
    await SecurityCRUD.update_one({
            "symbol": security["symbol"],
            "exchange": security["exchange"]
        },
        security,
        upsert = True,
    )

    await collect_security_overview.cast(
        CollectSecurityOverview(symbol = security["symbol"], exchange = security["exchange"])
    )
....

செய்திக்கு முன்னர் அறிவிக்கப்பட்ட திட்டத்தைப் பயன்படுத்துகிறோம். இந்த வழக்கில், நான் .cast முறையைப் பயன்படுத்தினேன், ஏனென்றால் முகவரிடமிருந்து முடிவுக்காக நாங்கள் காத்திருக்க வேண்டியதில்லை, ஆனால் அதைக் குறிப்பிடுவது மதிப்பு. வழிகளில் தலைப்புக்கு ஒரு செய்தியை அனுப்பவும்:

  1. நடிகர்கள் - தடுக்காது, ஏனெனில் அது ஒரு முடிவை எதிர்பார்க்கவில்லை. முடிவை வேறொரு தலைப்புக்கு செய்தியாக அனுப்ப முடியாது.

  2. அனுப்பு - தடுக்காது, ஏனெனில் அது முடிவை எதிர்பார்க்கவில்லை. முடிவு செல்லும் தலைப்பில் ஒரு முகவரை நீங்கள் குறிப்பிடலாம்.

  3. கேளுங்கள் - முடிவுக்காக காத்திருக்கிறது. முடிவு செல்லும் தலைப்பில் ஒரு முகவரை நீங்கள் குறிப்பிடலாம்.

ஆக, இன்றைக்கு ஏஜெண்டுகள் அவ்வளவுதான்!

கனவு அணி

இந்த பகுதியில் எழுதுவதாக நான் உறுதியளித்த கடைசி விஷயம் கட்டளைகள். முன்பே குறிப்பிட்டது போல, ஃபாஸ்டில் உள்ள கட்டளைகள் கிளிக் சுற்றி ஒரு ரேப்பர் ஆகும். உண்மையில், -A விசையைக் குறிப்பிடும் போது ஃபாஸ்ட் அதன் இடைமுகத்துடன் நமது தனிப்பயன் கட்டளையை இணைக்கிறது

அறிவிக்கப்பட்ட முகவர்களுக்குப் பிறகு முகவர்கள்.py அலங்கரிப்பாளருடன் ஒரு செயல்பாட்டைச் சேர்க்கவும் app.commandமுறையை அழைக்கிறது நடிக்க у சேகரிப்பு_பத்திரங்கள்:

@app.command()
async def start_collect_securities():
    """Collect securities and overview."""

    await collect_securities.cast()

இவ்வாறு, நாம் கட்டளைகளின் பட்டியலை அழைத்தால், நமது புதிய கட்டளை அதில் இருக்கும்:

> faust -A horton.agents --help

....
Commands:
  agents                    List agents.
  clean-versions            Delete old version directories.
  completion                Output shell completion to be evaluated by the...
  livecheck                 Manage LiveCheck instances.
  model                     Show model detail.
  models                    List all available models as a tabulated list.
  reset                     Delete local table state.
  send                      Send message to agent/topic.
  start-collect-securities  Collect securities and overview.
  tables                    List available tables.
  worker                    Start worker instance for given app.

வேறு எவரையும் போல நாமும் இதைப் பயன்படுத்தலாம், எனவே ஃபாஸ்ட் தொழிலாளியை மறுதொடக்கம் செய்து, பத்திரங்களின் முழு அளவிலான சேகரிப்பைத் தொடங்குவோம்:

> faust -A horton.agents start-collect-securities

அடுத்து என்ன நடக்கும்?

அடுத்த பகுதியில், மீதமுள்ள முகவர்களை உதாரணமாகப் பயன்படுத்தி, ஆண்டிற்கான வர்த்தகத்தின் இறுதி விலைகள் மற்றும் முகவர்களின் கிரான் வெளியீட்டில் உச்சநிலையைத் தேடுவதற்கான சிங்க் பொறிமுறையை நாங்கள் கருத்தில் கொள்வோம்.

இன்னைக்கு அவ்வளவுதான்! வாசித்ததற்கு நன்றி :)

இந்த பகுதிக்கான குறியீடு

ஃபாஸ்டில் பின்னணி பணிகள், பகுதி II: முகவர்கள் மற்றும் அணிகள்

PS கடைசிப் பகுதியின் கீழ் ஃபாஸ்ட் மற்றும் சங்கமமான காஃப்கா பற்றி என்னிடம் கேட்கப்பட்டது (சங்கமம் என்ன அம்சங்களைக் கொண்டுள்ளது?) சங்கமமானது பல வழிகளில் மிகவும் செயல்பாட்டுடன் இருப்பதாகத் தெரிகிறது, ஆனால் உண்மை என்னவென்றால், ஃபாஸ்டுக்கு சங்கமத்திற்கு முழு கிளையன்ட் ஆதரவு இல்லை - இது பின்வருமாறு ஆவணத்தில் கிளையன்ட் கட்டுப்பாடுகள் பற்றிய விளக்கங்கள்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்