More to Lecture 1

This commit is contained in:
Filip Gralinski 2022-02-16 20:07:58 +01:00
parent ce903c6dd6
commit 732b134412
8 changed files with 610 additions and 167 deletions

View File

@ -1,122 +1,204 @@
{ {
"cells": [ "cells": [
{ {
"attachments": {},
"cell_type": "markdown", "cell_type": "markdown",
"id": "1de4614f",
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Język — różne perspektywy\n", "## Język — różne perspektywy\n",
"\n", "\n"
"## Słowo wstępne\n", ]
"\n", },
"W matematyce istnieją dwa spojrzenia na rzeczywistość: ciągłe i\n", {
"dyskretne.\n", "cell_type": "markdown",
"\n", "metadata": {},
"Otaczająca nas rzeczywistość fizyczna jest z natury ciągła (przynajmniej\n", "source": [
"jeśli nie operujemy w mikroskali), lecz język jest dyskretnym wyłomem w\n", "### Słowo wstępne\n",
"ciągłej rzeczywistości.\n", "\n"
"\n", ]
"## Lingwistyka matematyczna\n", },
{
"cell_type": "markdown",
"metadata": {},
"source": [
"W matematyce istnieją dwa spojrzenia na rzeczywistość: ciągłe i dyskretne.\n",
"\n", "\n",
"Otaczająca nas rzeczywistość fizyczna jest z natury ciągła\n",
"(przynajmniej jeśli nie operujemy w mikroskali), lecz język\n",
"jest dyskretnym wyłomem w ciągłej rzeczywistości.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Lingwistyka matematyczna\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Przypomnijmy sobie definicję języka przyjętą w lingwistyce\n", "Przypomnijmy sobie definicję języka przyjętą w lingwistyce\n",
"matematycznej, w kontekście na przykład teorii.\n", "matematycznej, w kontekście na przykład teorii automatów.\n",
"\n", "\n",
"****Alfabetem**** nazywamy skończony zbiór symboli.\n", "****Alfabetem**** nazywamy skończony zbiór symboli.\n",
"\n", "\n",
"****Łańcuchem**** nad alfabetem $\\Sigma$ nazywamy dowolny, skończony,\n", "****Łańcuchem**** nad alfabetem $\\Sigma$ nazywamy dowolny, skończony,\n",
"ciąg złożony z symboli z $\\Sigma$\n", "ciąg złożony z symboli z $\\Sigma$\n",
"\n", "\n",
"****Językiem**** nazywamy dowolny, skończony bądź nieskończony, zbiór\n", "****Językiem**** nazywamy dowolny, skończony bądź nieskończony, zbiór łańcuchów.\n",
"łańcuchów.\n",
"\n", "\n",
"W tym formalnym ujęciu językami są na przykład następujące zbiory:\n", "W tym formalnym ujęciu językami są na przykład następujące zbiory:\n",
"\n", "\n",
"- ${\\mathit{poniedziałek},\\mathit{wtorek},\\mathit{środa},\\mathit{czwartek},\\mathit{piątek},\\mathit{sobota},\\mathit{niedziela}$\n", "- $\\{\\mathit{poniedziałek},\\mathit{wtorek},\\mathit{środa},\\mathit{czwartek},\\mathit{piątek},\\mathit{sobota},\\mathit{niedziela}\\}$\n",
"- ${\\mathit{ab},\\mathit{abb},\\mathit{abbb},\\mathit{abbbb},\\ldots}$\n", "- $\\{\\mathit{ab},\\mathit{abb},\\mathit{abbb},\\mathit{abbbb},\\ldots\\}$\n",
"\n", "\n",
"To podejście, z jednej strony oczywiście nie do końca się potocznym\n", "To podejście, z jednej strony oczywiście nie do końca się pokrywa się z potocznym\n",
"rozumieniem słowa *język*, z drugiej kojarzy nam się z takimi\n", "rozumieniem słowa *język*, z drugiej kojarzy nam się z takimi\n",
"narzędziami informatyki jak wyrażenia regularne, automaty skończenie\n", "narzędziami informatyki jak wyrażenia regularne, automaty skończenie\n",
"stanowe czy gramatyki języków programowania.\n", "stanowe czy gramatyki języków programowania.\n",
"\n", "\n"
"``` ipython\n", ]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"abbb"
]
}
],
"source": [
"import regex as re\n", "import regex as re\n",
"rx = re.compile(r'ab+')\n", "rx = re.compile(r'ab+')\n",
"\n", "\n",
"rx.search('żabbba').group(0)\n", "rx.search('żabbba').group(0)"
"```\n", ]
"\n", },
"abbb\n", {
"\n", "cell_type": "code",
"``` ipython\n", "execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
]
}
],
"source": [
"import rstr\n", "import rstr\n",
"\n", "\n",
"rstr.xeger(r'ab+')\n", "rstr.xeger(r'ab+')"
"```\n", ]
"\n", },
"abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n", {
"\n", "cell_type": "markdown",
"## Ujęcie probabilistyczne\n", "metadata": {},
"\n", "source": [
"### Ujęcie probabilistyczne\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Na tym wykładzie przyjmiemy inną perspektywą, częściowo ciągłą, opartą\n", "Na tym wykładzie przyjmiemy inną perspektywą, częściowo ciągłą, opartą\n",
"na probabilistyce. Język będziemy definiować poprzez ****rozkład\n", "na probabilistyce. Język będziemy definiować poprzez ****rozkład\n",
"prawdopodobieństwa****: sensownym wypowiedziom czy tekstom będziemy\n", "prawdopodobieństwa****: sensownym wypowiedziom czy tekstom będziemy\n",
"przypisywać stosunkowe wysokie prawdopodobieństwo, „ułomnym” tekstom —\n", "przypisywać stosunkowe wysokie prawdopodobieństwo, „ułomnym” tekstom — niższe (być może zerowe).\n",
"niższe (być może zerowe).\n",
"\n", "\n",
"Na ogół nie mamy jednak do czynienia z językiem jako takim tylko z jego\n", "Na ogół nie mamy jednak do czynienia z językiem jako takim tylko z\n",
"przybliżeniami, ****modelami**** (model może być lepszy lub gorszy, ale\n", "jego przybliżeniami, ****modelami**** (model może być lepszy lub gorszy,\n",
"przynajmniej powinien być użyteczny…). Formalnie $M$ nazywamy modelem\n", "ale przynajmniej powinien być użyteczny…). Formalnie $M$ nazywamy\n",
"języka (nad skończonym alfabetem $Sigma$), jeśli dyskretny określa\n", "modelem języka (nad skończonym alfabetem $Sigma$), jeśli dyskretny określa rozkład prawdopodobieństwa $P_M$:\n",
"rozkład prawdopodobieństwa $P_M$:\n",
"\n", "\n",
"$$P_M \\colon \\Sigma^{*} \\rightarrow [0,1].$$\n", "$$P_M \\colon \\Sigma^{*} \\rightarrow [0,1].$$\n",
"\n", "\n",
"Rzecz jasna, skoro mamy do czynienia z rozkładem prawdopodobieństwa, to:\n", "Rzecz jasna, skoro mamy do czynienia z rozkładem prawdopodobieństwa, to:\n",
"\n", "\n",
"$$\\Sum_{\\alpha \\in \\Sigma^{*}} P_M(\\alpha) = 1$$\n", "$$\\sum_{\\alpha \\in \\Sigma^{*}} P_M(\\alpha) = 1$$\n",
"\n", "\n",
"Jeśli $M$ ma być modelem języka polskiego, oczekiwalibyśmy, że dla\n", "Jeśli $M$ ma być modelem języka polskiego, oczekiwalibyśmy, że dla\n",
"napisów:\n", "napisów:\n",
"\n", "\n",
"- $z_1$ — *W tym stanie rzeczy pan Ignacy coraz częściej myślał o\n", "- $z_1$ — *W tym stanie rzeczy pan Ignacy coraz częściej myślał o Wokulskim.*\n",
" Wokulskim.*\n", "- $z_2$ — *Po wypełniony zbiornik pełny i należne kwotę, usłyszała w attendant*\n",
"- $z_2$ — *Po wypełniony zbiornik pełny i należne kwotę, usłyszała w\n",
" attendant*\n",
"- $z_3$ — *xxxxyźźźźźit backspace hoooooooooop x y z*\n", "- $z_3$ — *xxxxyźźźźźit backspace hoooooooooop x y z*\n",
"\n", "\n",
"zachodzić będzie:\n", "zachodzić będzie:\n",
"\n", "\n",
"$$ P_M(z_1) > P_M(z_2) > P_M(z_3). $$\n", "$$ P_M(z_1) > P_M(z_2) > P_M(z_3). $$\n",
"\n", "\n",
"****Pytanie**** Jakiej konkretnie wartości prawdopodobieństwa byśmy\n",
"spodziewali się dla zdania *Dzisiaj rano kupiłem w piekarni sześć\n",
"bułek* dla sensownego modelu języka polskiego?\n",
"\n",
"Moglibyśmy sprowadzić tę definicję języka do tej „dyskretnej”, tzn.\n", "Moglibyśmy sprowadzić tę definicję języka do tej „dyskretnej”, tzn.\n",
"moglibyśmy przyjąć, że łańcuch $\\alpha$ należy do języka wyznaczonego\n", "moglibyśmy przyjąć, że łańcuch $\\alpha$ należy do języka wyznaczonego\n",
"przez model $M$, jeśli $P_M(\\alpha) > 0$.\n", "przez model $M$, jeśli $P_M(\\alpha) > 0$.\n",
"\n", "\n",
"****Pytanie**** Czy moglibyśmy w ten sposób język nieskończony? Czy może\n", "****Pytanie**** Czy moglibyśmy w ten sposób język nieskończony? Czy może istnieć\n",
"istnieć dyskretny rozkład prawdopodobieństwa dla nieskończonego zbioru?\n", "dyskretny rozkład prawdopodobieństwa dla nieskończonego zbioru?\n",
"\n", "\n"
"## Co jest symbolem?\n", ]
"\n", },
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Co jest symbolem?\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Model języka daje rozkład prawdopodobieństwa nad zbiorem łańcuchów\n", "Model języka daje rozkład prawdopodobieństwa nad zbiorem łańcuchów\n",
"opartym na skończonym alfabecie, tj. zbiorze symboli. W praktyce alfabet\n", "opartym na skończonym alfabecie, tj. zbiorze symboli. W praktyce\n",
"nie musi być zgodny z potocznym czy językoznawczym rozumieniem tego\n", "alfabet nie musi być zgodny z potocznym czy językoznawczym rozumieniem\n",
"słowa. To znaczy alfabet może być zbiorem znaków (liter), ale modelować\n", "tego słowa. To znaczy alfabet może być zbiorem znaków (liter), ale\n",
"język możemy też przyjmując inny typ symboli: sylaby, morfemy (cząstki\n", "modelować język możemy też przyjmując inny typ symboli: sylaby,\n",
"wyrazów) czy po prostu całe wyrazy.\n", "morfemy (cząstki wyrazów) czy po prostu całe wyrazy.\n",
"\n", "\n",
"Powinniśmy przy tym pamiętać, że, koniec końców, w pamięci komputera\n", "Powinniśmy przy tym pamiętać, że, koniec końców, w pamięci komputera\n",
"wszelkiego rodzaju łańcuchy są zapisywane jako ciągi zer i jedynek —\n", "wszelkiego rodzaju łańcuchy są zapisywane jako ciągi zer i jedynek — bitów.\n",
"bitów. Omówmy pokrótce techniczną stronę modelowania języka.\n", "Omówmy pokrótce techniczną stronę modelowania języka.\n",
"\n", "\n"
"# Kodowanie znaków\n", ]
"\n", },
"## Cóż może być prostszego od pliku tekstowego?\n", {
"\n", "cell_type": "markdown",
"``` example\n", "metadata": {},
"source": [
"## Kodowanie znaków\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Cóż może być prostszego od pliku tekstowego?\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" Ala ma kota.\n", " Ala ma kota.\n",
"```\n",
"\n", "\n",
"Komputer nic nie wie o literach.\n", "Komputer nic nie wie o literach.\n",
"\n", "\n",
@ -126,91 +208,309 @@
"\n", "\n",
"… a tak naprawdę na ciągłym sygnale elektrycznym …\n", "… a tak naprawdę na ciągłym sygnale elektrycznym …\n",
"\n", "\n",
"![](attachment:./digitalsignal.jpg)\n", "![img](./01_Jezyk/digitalsignal.jpg)\n",
"\n", "\n",
"… zera i jedynki są w naszej głowie …\n", "… zera i jedynki są w naszej głowie …\n",
"\n", "\n",
"… co jest dziwne, *naprawdę* dziwne …\n", "… co jest dziwne, *naprawdę* dziwne …\n",
"\n", "\n",
"… ale nikt normalny się tym nie przejmuje.\n", "… ale nikt normalny się tym nie przejmuje.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Jak zakodować literę?\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Zakodowanie pikseli składających się na kształtu (****glyfu****) litery A\n",
"*oczywiście* nie jest dobrym pomysłem.\n",
"\n", "\n",
"## Jak zakodować literę?\n", "![img](./01_Jezyk/raster.png)\n",
"\n",
"Zakodowanie pikseli składających się na kształtu (****glyfu****) litery\n",
"A *oczywiście* nie jest dobrym pomysłem.\n",
"\n",
"![](attachment:./raster.png)\n",
"\n", "\n",
"Nie, potrzebujemy *arbitralnego* kodowania dla wszystkich możliwych\n", "Nie, potrzebujemy *arbitralnego* kodowania dla wszystkich możliwych\n",
"kształtów litery A (*w naszych głowach*): A, $\\mathcal{A}$,\n", "kształtów litery A (*w naszych głowach*): A, $\\mathcal{A}$,\n",
"$\\mathbb{A}$, $\\mathfrak{A}$ powinny otrzymać ten sam kod, powiedzmy 65\n", "$\\mathbb{A}$, $\\mathfrak{A}$ powinny otrzymać ten sam kod, powiedzmy 65\n",
"(binarnie: 1000001).\n", "(binarnie: 1000001).\n",
"\n", "\n"
"## ASCII\n", ]
"\n", },
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ASCII\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ASCII to 7-bitowy (****nie**** 8-bitowy!) system kodowania znaków.\n", "ASCII to 7-bitowy (****nie**** 8-bitowy!) system kodowania znaków.\n",
"\n", "\n"
"``` ipython\n", ]
"for code in range(0, 128):\n", },
" print(f'{code}: {chr(code)}')\n", {
"```\n", "cell_type": "code",
"\n", "execution_count": 1,
"0: \u0000 1: \u0001 2: \u0002 3: \u0003 4: \u0004 5: \u0005 6: \u0006 7: \u0007 8: \b 9: 10:\n", "metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0: \u0000\n",
"1: \u0001\n",
"2: \u0002\n",
"3: \u0003\n",
"4: \u0004\n",
"5: \u0005\n",
"6: \u0006\n",
"7: \u0007\n",
"8: \b\n",
"9:\n",
"10:\n",
"\n", "\n",
"11: \u000b", "11: \u000b",
"\n",
"12: \f", "12: \f",
" 13: 14: \u000e 15: \u000f 16: \u0010 17: \u0011 18: \u0012 19: \u0013 20: \u0014 21: \u0015 22: \u0016\n", "\n",
"23: \u0017 24: \u0018 25: \u0019 26: \u001a 27: \u001b 28: \u001c", "13:\n",
"14: \u000e\n",
"15: \u000f\n",
"16: \u0010\n",
"17: \u0011\n",
"18: \u0012\n",
"19: \u0013\n",
"20: \u0014\n",
"21: \u0015\n",
"22: \u0016\n",
"23: \u0017\n",
"24: \u0018\n",
"25: \u0019\n",
"26: \u001a\n",
"27: \u001b\n",
"28: \u001c",
"\n",
"29: \u001d", "29: \u001d",
"\n",
"30: \u001e", "30: \u001e",
" 31: \u001f 32: 33: ! 34: \"\n",
"35: \\# 36: \\$ 37: % 38: & 39: ' 40: ( 41: ) 42: \\* 43: + 44: , 45: - 46:\n",
". 47: / 48: 0 49: 1 50: 2 51: 3 52: 4 53: 5 54: 6 55: 7 56: 8 57: 9 58:\n",
": 59: ; 60: \\< 61: = 62: \\> 63: ? 64: @ 65: A 66: B 67: C 68: D 69: E\n",
"70: F 71: G 72: H 73: I 74: J 75: K 76: L 77: M 78: N 79: O 80: P 81: Q\n",
"82: R 83: S 84: T 85: U 86: V 87: W 88: X 89: Y 90: Z 91: \\[ 92: \\\\ 93:\n",
"\\] 94: ^ 95: \\_ 96: \\` 97: a 98: b 99: c 100: d 101: e 102: f 103: g\n",
"104: h 105: i 106: j 107: k 108: l 109: m 110: n 111: o 112: p 113: q\n",
"114: r 115: s 116: t 117: u 118: v 119: w 120: x 121: y 122: z 123: {\n",
"124: \\| 125: } 126: \\~ 127: \n",
"\n",
"## Jak zejść na poziom bitów?\n",
"\n",
"### Linux — wiersz poleceń\n",
"\n", "\n",
"31: \u001f\n",
"32:\n",
"33: !\n",
"34: \"\n",
"35: #\n",
"36: $\n",
"37: %\n",
"38: &\n",
"39: '\n",
"40: (\n",
"41: )\n",
"42: *\n",
"43: +\n",
"44: ,\n",
"45: -\n",
"46: .\n",
"47: /\n",
"48: 0\n",
"49: 1\n",
"50: 2\n",
"51: 3\n",
"52: 4\n",
"53: 5\n",
"54: 6\n",
"55: 7\n",
"56: 8\n",
"57: 9\n",
"58: :\n",
"59: ;\n",
"60: <\n",
"61: =\n",
"62: >\n",
"63: ?\n",
"64: @\n",
"65: A\n",
"66: B\n",
"67: C\n",
"68: D\n",
"69: E\n",
"70: F\n",
"71: G\n",
"72: H\n",
"73: I\n",
"74: J\n",
"75: K\n",
"76: L\n",
"77: M\n",
"78: N\n",
"79: O\n",
"80: P\n",
"81: Q\n",
"82: R\n",
"83: S\n",
"84: T\n",
"85: U\n",
"86: V\n",
"87: W\n",
"88: X\n",
"89: Y\n",
"90: Z\n",
"91: [\n",
"92: \\\n",
"93: ]\n",
"94: ^\n",
"95: _\n",
"96: `\n",
"97: a\n",
"98: b\n",
"99: c\n",
"100: d\n",
"101: e\n",
"102: f\n",
"103: g\n",
"104: h\n",
"105: i\n",
"106: j\n",
"107: k\n",
"108: l\n",
"109: m\n",
"110: n\n",
"111: o\n",
"112: p\n",
"113: q\n",
"114: r\n",
"115: s\n",
"116: t\n",
"117: u\n",
"118: v\n",
"119: w\n",
"120: x\n",
"121: y\n",
"122: z\n",
"123: {\n",
"124: |\n",
"125: }\n",
"126: ~\n",
"127: "
]
}
],
"source": [
"for code in range(0, 128):\n",
" print(f'{code}: {chr(code)}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Jak zejść na poziom bitów?\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Linux — wiersz poleceń\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Linux command line:\n", "Linux command line:\n",
"\n", "\n",
"``` example\n",
" $ echo 'Ala ma kota' > file.txt\n", " $ echo 'Ala ma kota' > file.txt\n",
" $ hexdump -C file.txt\n", " $ hexdump -C file.txt\n",
" 00000000 41 6c 61 20 6d 61 20 6b 6f 74 61 0a |Ala ma kota.|\n", " 00000000 41 6c 61 20 6d 61 20 6b 6f 74 61 0a |Ala ma kota.|\n",
" 0000000c\n", " 0000000c\n",
"```\n", "\n"
"\n", ]
"### Edytor tekstu (Emacs)\n", },
"\n", {
"![](attachment:./hexl-mode.png)\n", "cell_type": "markdown",
"\n", "metadata": {},
"### Uwaga!\n", "source": [
"\n", "#### Edytor tekstu (Emacs)\n",
"- kiedy dzieje się coś dziwnego, sprawdź co tak *naprawdę* jest w\n", "\n"
" pliku\n", ]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![img](./01_Jezyk/hexl-mode.png)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Uwaga!\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- kiedy dzieje się coś dziwnego, sprawdź co tak *naprawdę* jest w pliku\n",
"- ASCII jest 7-bitowym kodowaniem (128 znaków)\n", "- ASCII jest 7-bitowym kodowaniem (128 znaków)\n",
" - choć zazwyczaj uzupełnionym (ang. *padded*) do 8 bitów\n", " - choć zazwyczaj uzupełnionym (ang. *padded*) do 8 bitów\n",
" - nie mów plik *plik ASCII*, kiedy masz na myśli *prosty/czysty\n", " - nie mów plik *plik ASCII*, kiedy masz na myśli *prosty/czysty plik tekstowy* (ang. *plain text file*)\n",
" plik tekstowy* (ang. *plain text file*)\n", "\n"
"\n", ]
"## Higiena plików tekstowych\n", },
"\n", {
"### Piekło końca wiersza\n", "cell_type": "markdown",
"\n", "metadata": {},
"![](attachment:./dante.jpg)\n", "source": [
"\n", "### Higiena plików tekstowych\n",
"Więcej na\n", "\n"
"<https://re-research.pl/pl/post/2017-01-28-00042-anatomia-pliku-tekstowego-2.html>\n", ]
"\n", },
"### Dobre rady\n", {
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Piekło końca wiersza\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![img](./01_Jezyk/dante.jpg)\n",
"\n", "\n",
"Więcej na [https://re-research.pl/pl/post/2017-01-28-00042-anatomia-pliku-tekstowego-2.html](https://re-research.pl/pl/post/2017-01-28-00042-anatomia-pliku-tekstowego-2.html)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Dobre rady\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- żadnych niepotrzebnych spacji na końcu wiersza\n", "- żadnych niepotrzebnych spacji na końcu wiersza\n",
"\n", "\n",
"- żadnych niepotrzebnych pustych wierszy na końcu pliku\n", "- żadnych niepotrzebnych pustych wierszy na końcu pliku\n",
@ -218,16 +518,27 @@
"- … ale ostatni wiersz powinien zakończyć się znakiem końca wiersza\n", "- … ale ostatni wiersz powinien zakończyć się znakiem końca wiersza\n",
"\n", "\n",
"- nie używać znaków tabulacji (zamiast tego 4 spacje)\n", "- nie używać znaków tabulacji (zamiast tego 4 spacje)\n",
"\n",
" - wyjątek: pliki TSV\n", " - wyjątek: pliki TSV\n",
" - wyjątek: pliki Makefile\n", " - wyjątek: pliki Makefile\n",
"\n", "\n",
"- uwaga na niestandardowe spacje i dziwne znaki o zerowej długości\n", "- uwaga na niestandardowe spacje i dziwne znaki o zerowej długości\n",
"\n", "\n"
"## Unikod\n", ]
"\n", },
"ASCII obejmuje 128 znaków: litery alfabetu łacińskiego (właściwie\n", {
"angielskiego), cyfry, znaki interpunkcyjne, znaki specjalne itd.\n", "cell_type": "markdown",
"metadata": {},
"source": [
"### Unikod\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ASCII obejmuje 128 znaków: litery alfabetu łacińskiego (właściwie angielskiego),\n",
"cyfry, znaki interpunkcyjne, znaki specjalne itd.\n",
"\n", "\n",
"Co z pozostałymi znakami? Polskimi ogonkami, czeskimi haczykami,\n", "Co z pozostałymi znakami? Polskimi ogonkami, czeskimi haczykami,\n",
"francuskimi akcentami, cyrylicą, koreańskim alfabetem, chińskimi\n", "francuskimi akcentami, cyrylicą, koreańskim alfabetem, chińskimi\n",
@ -239,34 +550,126 @@
"znakom używanym przez ludzkość liczby (kody, ang. *code points*).\n", "znakom używanym przez ludzkość liczby (kody, ang. *code points*).\n",
"\n", "\n",
"| Znak|Kod ASCII|Kod Unikodowy|\n", "| Znak|Kod ASCII|Kod Unikodowy|\n",
"|-------|-----------|---------------|\n", "|---|---|---|\n",
"| 9|57|57|\n", "| 9|57|57|\n",
"| a|97|97|\n", "| a|97|97|\n",
"| ą | \\- | 261 |\n", "| ą|-|261|\n",
"| ł | \\- | 322 |\n", "| ł|-|322|\n",
"| \\$ℵ\\$ | \\- | 1488 |\n", "| $\\aleph$|-|1488|\n",
"| ặ | \\- | 7861 |\n", "| ặ|-|7861|\n",
"| ☣ | \\- | 9763 |\n", "| ☣|-|9763|\n",
"| 😇 | \\- | 128519 |\n", "| 😇|-|128519|\n",
"\n", "\n"
"## UTF-8\n", ]
"\n", },
"Kody znaków są pojęciem abstrakcyjnym. Potrzebujemy konkretnego\n", {
"****kodowania**** by zamienić kody w sekwencję bajtów.\n", "cell_type": "markdown",
"Najpopularniejszym kodowaniem jest UTF-8.\n", "metadata": {},
"source": [
"### UTF-8\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Kody znaków są pojęciem abstrakcyjnym. Potrzebujemy konkretnego ****kodowania****\n",
"by zamienić kody w sekwencję bajtów. Najpopularniejszym kodowaniem jest UTF-8.\n",
"\n", "\n",
"W kodowaniu UTF-8 znaki zapisywane za pomocą 1, 2, 3 lub 4 bajtów.\n", "W kodowaniu UTF-8 znaki zapisywane za pomocą 1, 2, 3 lub 4 bajtów.\n",
"\n", "\n",
"| Znak | Kod Unikodowy |\n", "| Znak|Kod Unikodowy|Szesnastkowo|UTF-8 (binarnie)|\n",
"|-------|---------------|\n", "|---|---|---|---|\n",
"| 9 | 57 |\n", "| 9|57|U+0049|01001001|\n",
"| a | 97 |\n", "| a|97|U+0061|01100001|\n",
"| ą | 261 |\n", "| ą|261|U+0105|11000100:10000101|\n",
"| ł | 322 |\n", "| ł|322|U+0142|11000101:10000010|\n",
"| \\$ℵ\\$ | 1488 |\n", "| $\\aleph$|1488|U+05D0|11010111:10010000|\n",
"| ặ | 7861 |\n", "| ặ|7861|U+1EB7|11100001:10111010:10110111|\n",
"| ☣ | 9763 |\n", "| ☣|9763|U+2623|11100010:10011000:10100011|\n",
"| 😇 | 128519 |" "| 😇|128519|U+1f607|11110000:10011111:10011000:10000111|\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### *Źdźbło* to ile bajtów w UTF-8?\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Jeśli wczytasz jako wiersz w języku C, 11 bajtów!\n",
"\n",
"[./01_Jezyk/zdzblo.pdf](./01_Jezyk/zdzblo.pdf)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dlaczego UTF-8 jest doskonałym systemem kodowania?\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- wstecznie kompatybilny z ASCII\n",
" - plik ASCII jest poprawnym plikiem UTF-8\n",
"- nie zajmuje dużo miejsca\n",
" - chyba w tekście jest dużo „dziwnych” znaków\n",
"- proste grepowanie działa\n",
" - `grep UAM text-in-utf8.txt` zadziała\n",
" - ale nawet nie próbuj: `grep SRPOL text-in-utf16.txt`\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Porady\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- zawsze używaj UTF-8\n",
" - bądź asertywny! jeśli w pracy każą używać czegoś innego — rezygnuj z pracy\n",
" - **NIE** używaj innych unikodowych kodowań: UTF-16, UTF-32, UCS-2\n",
" - **NIE** używaj nieunikodowych systemów kodowania\n",
" - ISO-8859-2, Windows-1250, Mazovia, IEA Świerk, …\n",
"- uwaga na pułapki UTF-8\n",
" - ustalenie długości napisu w znakach wymaga przejścia znak po znaku\n",
" - jeśli napis w kodowaniu UTF-8 zajmuje 9 bajtów, ile to znaków?\n",
" 3, 4, 5, 6, 7, 8 lub 9!\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **NIE** używaj sekwencji BOM\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![img](./01_Jezyk/evil-bom.png)\n",
"\n"
] ]
} }
], ],
@ -287,8 +690,9 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.10.2" "version": "3.10.2"
} },
"org": null
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 5 "nbformat_minor": 1
} }

Binary file not shown.

BIN
wyk/01_Jezyk/dante.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
wyk/01_Jezyk/evil-bom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
wyk/01_Jezyk/hexl-mode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
wyk/01_Jezyk/zdzblo.pdf Normal file

Binary file not shown.

39
wyk/01_Jezyk/zdzblo.tex Normal file
View File

@ -0,0 +1,39 @@
\documentclass{article}
\usepackage[a6paper]{geometry}
\usepackage[T1]{fontenc}
\usepackage{bytefield}
\thispagestyle{empty}
\begin{document}
\begin{bytefield}{8}
\bitheader[endianness=big]{0-7} \\
\begin{leftwordgroup}{Ź}
\bitboxes{1}{11000101} \\
\bitboxes{1}{10111001}
\end{leftwordgroup} \\
\begin{leftwordgroup}{d}
\bitboxes{1}{01100100}
\end{leftwordgroup} \\
\begin{leftwordgroup}{ź}
\bitboxes{1}{11000101} \\
\bitboxes{1}{10111010}
\end{leftwordgroup} \\
\begin{leftwordgroup}{b}
\bitboxes{1}{01100010}
\end{leftwordgroup} \\
\begin{leftwordgroup}{ł}
\bitboxes{1}{11000101} \\
\bitboxes{1}{10000010}
\end{leftwordgroup} \\
\begin{leftwordgroup}{o}
\bitboxes{1}{01101111}
\end{leftwordgroup} \\
\begin{leftwordgroup}{\textit{koniec wiersza}}
\bitboxes{1}{00001010}
\end{leftwordgroup} \\
\begin{leftwordgroup}{\textit{koniec napisu}}
\bitboxes{1}{00000000}
\end{leftwordgroup}
\end{bytefield}
\end{document}