More to Lecture 1
This commit is contained in:
parent
ce903c6dd6
commit
732b134412
@ -1,122 +1,204 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"attachments": {},
|
||||
"cell_type": "markdown",
|
||||
"id": "1de4614f",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Język — różne perspektywy\n",
|
||||
"\n",
|
||||
"## Słowo wstępne\n",
|
||||
"\n",
|
||||
"W matematyce istnieją dwa spojrzenia na rzeczywistość: ciągłe i\n",
|
||||
"dyskretne.\n",
|
||||
"\n",
|
||||
"Otaczająca nas rzeczywistość fizyczna jest z natury ciągła (przynajmniej\n",
|
||||
"jeśli nie operujemy w mikroskali), lecz język jest dyskretnym wyłomem w\n",
|
||||
"ciągłej rzeczywistości.\n",
|
||||
"\n",
|
||||
"## Lingwistyka matematyczna\n",
|
||||
"## Język — różne perspektywy\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Słowo wstępne\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"W matematyce istnieją dwa spojrzenia na rzeczywistość: ciągłe i dyskretne.\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",
|
||||
"matematycznej, w kontekście na przykład teorii.\n",
|
||||
"matematycznej, w kontekście na przykład teorii automatów.\n",
|
||||
"\n",
|
||||
"****Alfabetem**** nazywamy skończony zbiór symboli.\n",
|
||||
"\n",
|
||||
"****Łańcuchem**** nad alfabetem $\\Sigma$ nazywamy dowolny, skończony,\n",
|
||||
"ciąg złożony z symboli z $\\Sigma$\n",
|
||||
"\n",
|
||||
"****Językiem**** nazywamy dowolny, skończony bądź nieskończony, zbiór\n",
|
||||
"łańcuchów.\n",
|
||||
"****Językiem**** nazywamy dowolny, skończony bądź nieskończony, zbiór łańcuchów.\n",
|
||||
"\n",
|
||||
"W tym formalnym ujęciu językami są na przykład następujące zbiory:\n",
|
||||
"\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{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",
|
||||
"\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",
|
||||
"narzędziami informatyki jak wyrażenia regularne, automaty skończenie\n",
|
||||
"stanowe czy gramatyki języków programowania.\n",
|
||||
"\n",
|
||||
"``` ipython\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"abbb"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import regex as re\n",
|
||||
"rx = re.compile(r'ab+')\n",
|
||||
"\n",
|
||||
"rx.search('żabbba').group(0)\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"abbb\n",
|
||||
"\n",
|
||||
"``` ipython\n",
|
||||
"rx.search('żabbba').group(0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import rstr\n",
|
||||
"\n",
|
||||
"rstr.xeger(r'ab+')\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n",
|
||||
"\n",
|
||||
"## Ujęcie probabilistyczne\n",
|
||||
"\n",
|
||||
"rstr.xeger(r'ab+')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"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 probabilistyce. Język będziemy definiować poprzez ****rozkład\n",
|
||||
"prawdopodobieństwa****: sensownym wypowiedziom czy tekstom będziemy\n",
|
||||
"przypisywać stosunkowe wysokie prawdopodobieństwo, „ułomnym” tekstom —\n",
|
||||
"niższe (być może zerowe).\n",
|
||||
"przypisywać stosunkowe wysokie prawdopodobieństwo, „ułomnym” tekstom — niższe (być może zerowe).\n",
|
||||
"\n",
|
||||
"Na ogół nie mamy jednak do czynienia z językiem jako takim tylko z jego\n",
|
||||
"przybliżeniami, ****modelami**** (model może być lepszy lub gorszy, ale\n",
|
||||
"przynajmniej powinien być użyteczny…). Formalnie $M$ nazywamy modelem\n",
|
||||
"języka (nad skończonym alfabetem $Sigma$), jeśli dyskretny określa\n",
|
||||
"rozkład prawdopodobieństwa $P_M$:\n",
|
||||
"Na ogół nie mamy jednak do czynienia z językiem jako takim tylko z\n",
|
||||
"jego przybliżeniami, ****modelami**** (model może być lepszy lub gorszy,\n",
|
||||
"ale przynajmniej powinien być użyteczny…). Formalnie $M$ nazywamy\n",
|
||||
"modelem języka (nad skończonym alfabetem $Sigma$), jeśli dyskretny określa rozkład prawdopodobieństwa $P_M$:\n",
|
||||
"\n",
|
||||
"$$P_M \\colon \\Sigma^{*} \\rightarrow [0,1].$$\n",
|
||||
"\n",
|
||||
"Rzecz jasna, skoro mamy do czynienia z rozkładem prawdopodobieństwa, to:\n",
|
||||
"\n",
|
||||
"$$\\Sum_{\\alpha \\in \\Sigma^{*}} P_M(\\alpha) = 1$$\n",
|
||||
"$$\\sum_{\\alpha \\in \\Sigma^{*}} P_M(\\alpha) = 1$$\n",
|
||||
"\n",
|
||||
"Jeśli $M$ ma być modelem języka polskiego, oczekiwalibyśmy, że dla\n",
|
||||
"napisów:\n",
|
||||
"\n",
|
||||
"- $z_1$ — *W tym stanie rzeczy pan Ignacy coraz częściej myślał o\n",
|
||||
" Wokulskim.*\n",
|
||||
"- $z_2$ — *Po wypełniony zbiornik pełny i należne kwotę, usłyszała w\n",
|
||||
" attendant*\n",
|
||||
"- $z_1$ — *W tym stanie rzeczy pan Ignacy coraz częściej myślał o Wokulskim.*\n",
|
||||
"- $z_2$ — *Po wypełniony zbiornik pełny i należne kwotę, usłyszała w attendant*\n",
|
||||
"- $z_3$ — *xxxxyźźźźźit backspace hoooooooooop x y z*\n",
|
||||
"\n",
|
||||
"zachodzić będzie:\n",
|
||||
"\n",
|
||||
"$$ P_M(z_1) > P_M(z_2) > P_M(z_3). $$\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 przyjąć, że łańcuch $\\alpha$ należy do języka wyznaczonego\n",
|
||||
"przez model $M$, jeśli $P_M(\\alpha) > 0$.\n",
|
||||
"\n",
|
||||
"****Pytanie**** Czy moglibyśmy w ten sposób język nieskończony? Czy może\n",
|
||||
"istnieć dyskretny rozkład prawdopodobieństwa dla nieskończonego zbioru?\n",
|
||||
"\n",
|
||||
"## Co jest symbolem?\n",
|
||||
"\n",
|
||||
"****Pytanie**** Czy moglibyśmy w ten sposób język nieskończony? Czy może istnieć\n",
|
||||
"dyskretny rozkład prawdopodobieństwa dla nieskończonego zbioru?\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",
|
||||
"opartym na skończonym alfabecie, tj. zbiorze symboli. W praktyce alfabet\n",
|
||||
"nie musi być zgodny z potocznym czy językoznawczym rozumieniem tego\n",
|
||||
"słowa. To znaczy alfabet może być zbiorem znaków (liter), ale modelować\n",
|
||||
"język możemy też przyjmując inny typ symboli: sylaby, morfemy (cząstki\n",
|
||||
"wyrazów) czy po prostu całe wyrazy.\n",
|
||||
"opartym na skończonym alfabecie, tj. zbiorze symboli. W praktyce\n",
|
||||
"alfabet nie musi być zgodny z potocznym czy językoznawczym rozumieniem\n",
|
||||
"tego słowa. To znaczy alfabet może być zbiorem znaków (liter), ale\n",
|
||||
"modelować język możemy też przyjmując inny typ symboli: sylaby,\n",
|
||||
"morfemy (cząstki wyrazów) czy po prostu całe wyrazy.\n",
|
||||
"\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",
|
||||
"bitów. Omówmy pokrótce techniczną stronę modelowania języka.\n",
|
||||
"\n",
|
||||
"# Kodowanie znaków\n",
|
||||
"\n",
|
||||
"## Cóż może być prostszego od pliku tekstowego?\n",
|
||||
"\n",
|
||||
"``` example\n",
|
||||
"Ala ma kota.\n",
|
||||
"```\n",
|
||||
"wszelkiego rodzaju łańcuchy są zapisywane jako ciągi zer i jedynek — bitów.\n",
|
||||
"Omówmy pokrótce techniczną stronę modelowania języka.\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"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",
|
||||
"\n",
|
||||
"Komputer nic nie wie o literach.\n",
|
||||
"\n",
|
||||
@ -126,91 +208,309 @@
|
||||
"\n",
|
||||
"… a tak naprawdę na ciągłym sygnale elektrycznym …\n",
|
||||
"\n",
|
||||
"![](attachment:./digitalsignal.jpg)\n",
|
||||
"![img](./01_Jezyk/digitalsignal.jpg)\n",
|
||||
"\n",
|
||||
"… zera i jedynki są w naszej głowie …\n",
|
||||
"\n",
|
||||
"… co jest dziwne, *naprawdę* dziwne …\n",
|
||||
"\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",
|
||||
"## Jak zakodować literę?\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",
|
||||
"![img](./01_Jezyk/raster.png)\n",
|
||||
"\n",
|
||||
"Nie, potrzebujemy *arbitralnego* kodowania dla wszystkich możliwych\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",
|
||||
"(binarnie: 1000001).\n",
|
||||
"\n",
|
||||
"## ASCII\n",
|
||||
"\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",
|
||||
"\n",
|
||||
"``` ipython\n",
|
||||
"for code in range(0, 128):\n",
|
||||
" print(f'{code}: {chr(code)}')\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"0: \u0000 1: \u0001 2: \u0002 3: \u0003 4: \u0004 5: \u0005 6: \u0006 7: \u0007 8: \b 9: 10:\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"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",
|
||||
"11: \u000b",
|
||||
" 12: \f",
|
||||
" 13: 14: \u000e 15: \u000f 16: \u0010 17: \u0011 18: \u0012 19: \u0013 20: \u0014 21: \u0015 22: \u0016\n",
|
||||
"23: \u0017 24: \u0018 25: \u0019 26: \u001a 27: \u001b 28: \u001c",
|
||||
" 29: \u001d",
|
||||
" 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",
|
||||
"12: \f",
|
||||
"\n",
|
||||
"### Linux — wiersz poleceń\n",
|
||||
"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",
|
||||
"\n",
|
||||
"30: \u001e",
|
||||
"\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",
|
||||
"\n",
|
||||
"``` example\n",
|
||||
"$ echo 'Ala ma kota' > 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",
|
||||
"0000000c\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"### Edytor tekstu (Emacs)\n",
|
||||
"\n",
|
||||
"![](attachment:./hexl-mode.png)\n",
|
||||
"\n",
|
||||
"### Uwaga!\n",
|
||||
"\n",
|
||||
"- kiedy dzieje się coś dziwnego, sprawdź co tak *naprawdę* jest w\n",
|
||||
" pliku\n",
|
||||
" $ echo 'Ala ma kota' > 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",
|
||||
" 0000000c\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Edytor tekstu (Emacs)\n",
|
||||
"\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",
|
||||
" - 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",
|
||||
" plik tekstowy* (ang. *plain text file*)\n",
|
||||
"\n",
|
||||
"## Higiena plików tekstowych\n",
|
||||
"\n",
|
||||
"### Piekło końca wiersza\n",
|
||||
"\n",
|
||||
"![](attachment:./dante.jpg)\n",
|
||||
"\n",
|
||||
"Więcej na\n",
|
||||
"<https://re-research.pl/pl/post/2017-01-28-00042-anatomia-pliku-tekstowego-2.html>\n",
|
||||
"\n",
|
||||
"### Dobre rady\n",
|
||||
" - nie mów plik *plik ASCII*, kiedy masz na myśli *prosty/czysty plik tekstowy* (ang. *plain text file*)\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Higiena plików tekstowych\n",
|
||||
"\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",
|
||||
"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",
|
||||
"\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",
|
||||
"\n",
|
||||
"- nie używać znaków tabulacji (zamiast tego 4 spacje)\n",
|
||||
"\n",
|
||||
" - wyjątek: pliki TSV\n",
|
||||
" - wyjątek: pliki Makefile\n",
|
||||
"\n",
|
||||
"- uwaga na niestandardowe spacje i dziwne znaki o zerowej długości\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",
|
||||
"\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",
|
||||
"Co z pozostałymi znakami? Polskimi ogonkami, czeskimi haczykami,\n",
|
||||
"francuskimi akcentami, cyrylicą, koreańskim alfabetem, chińskimi\n",
|
||||
@ -238,35 +549,127 @@
|
||||
"Rozwiązaniem jest Unikod (ang. *Unicode*) system, który przypisuje\n",
|
||||
"znakom używanym przez ludzkość liczby (kody, ang. *code points*).\n",
|
||||
"\n",
|
||||
"| Znak | Kod ASCII | Kod Unikodowy |\n",
|
||||
"|-------|-----------|---------------|\n",
|
||||
"| 9 | 57 | 57 |\n",
|
||||
"| a | 97 | 97 |\n",
|
||||
"| ą | \\- | 261 |\n",
|
||||
"| ł | \\- | 322 |\n",
|
||||
"| \\$ℵ\\$ | \\- | 1488 |\n",
|
||||
"| ặ | \\- | 7861 |\n",
|
||||
"| ☣ | \\- | 9763 |\n",
|
||||
"| 😇 | \\- | 128519 |\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",
|
||||
"Najpopularniejszym kodowaniem jest UTF-8.\n",
|
||||
"| Znak|Kod ASCII|Kod Unikodowy|\n",
|
||||
"|---|---|---|\n",
|
||||
"| 9|57|57|\n",
|
||||
"| a|97|97|\n",
|
||||
"| ą|-|261|\n",
|
||||
"| ł|-|322|\n",
|
||||
"| $\\aleph$|-|1488|\n",
|
||||
"| ặ|-|7861|\n",
|
||||
"| ☣|-|9763|\n",
|
||||
"| 😇|-|128519|\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"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",
|
||||
"W kodowaniu UTF-8 znaki zapisywane za pomocą 1, 2, 3 lub 4 bajtów.\n",
|
||||
"\n",
|
||||
"| Znak | Kod Unikodowy |\n",
|
||||
"|-------|---------------|\n",
|
||||
"| 9 | 57 |\n",
|
||||
"| a | 97 |\n",
|
||||
"| ą | 261 |\n",
|
||||
"| ł | 322 |\n",
|
||||
"| \\$ℵ\\$ | 1488 |\n",
|
||||
"| ặ | 7861 |\n",
|
||||
"| ☣ | 9763 |\n",
|
||||
"| 😇 | 128519 |"
|
||||
"| Znak|Kod Unikodowy|Szesnastkowo|UTF-8 (binarnie)|\n",
|
||||
"|---|---|---|---|\n",
|
||||
"| 9|57|U+0049|01001001|\n",
|
||||
"| a|97|U+0061|01100001|\n",
|
||||
"| ą|261|U+0105|11000100:10000101|\n",
|
||||
"| ł|322|U+0142|11000101:10000010|\n",
|
||||
"| $\\aleph$|1488|U+05D0|11010111:10010000|\n",
|
||||
"| ặ|7861|U+1EB7|11100001:10111010:10110111|\n",
|
||||
"| ☣|9763|U+2623|11100010:10011000:10100011|\n",
|
||||
"| 😇|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",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.2"
|
||||
}
|
||||
},
|
||||
"org": null
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
"nbformat_minor": 1
|
||||
}
|
||||
|
BIN
wyk/01_Jezyk.org
BIN
wyk/01_Jezyk.org
Binary file not shown.
BIN
wyk/01_Jezyk/dante.jpg
Normal file
BIN
wyk/01_Jezyk/dante.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
BIN
wyk/01_Jezyk/digitalsignal.jpg
Normal file
BIN
wyk/01_Jezyk/digitalsignal.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 78 KiB |
BIN
wyk/01_Jezyk/evil-bom.png
Normal file
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
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
BIN
wyk/01_Jezyk/zdzblo.pdf
Normal file
Binary file not shown.
39
wyk/01_Jezyk/zdzblo.tex
Normal file
39
wyk/01_Jezyk/zdzblo.tex
Normal 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}
|
Loading…
Reference in New Issue
Block a user