Вперёд, к тёплому ламповому аналогу!

Очень инте­рес­ные нын­че раз­ви­тия тех­но­ло­гий наме­ча­ют­ся. Огром­ной осно­вой боль­шо­го коли­че­ства совре­мен­ных про­грамм явля­ют­ся ней­ро­се­ти. Ней­ро­се­ти у нас нын­че рас­тут аки это самое в дере­вен­ском сор­ти­ре, куда дрож­жи кину­ли. Адски рас­тёт коли­че­ство пара­мет­ров (взве­шен­ных свя­зей) меж­ду ней­ро­на­ми.

Набор пара­мет­ров кажо­го ней­ро­на пред­став­ля­ет собой мат­ри­цу, и что­бы посчи­тать, акти­ви­ру­ет­ся ли ней­рон или нет, надо помно­жить вес каж­дой свя­зи на вход­ное зна­че­ние этой свя­зи, и смот­реть, что полу­чит­ся. Мате­ма­ти­че­ски выра­жа­ясь, счи­та­ет­ся ска­ляр­ное про­из­ве­де­ние.

Коли­че­ство пара­мет­ров гуг­лов­ской ней­ро­се­ти Inception тре­тей вер­сии — при­мер­но 12 мил­ли­о­нов. То-есть, каж­дый раз мы счи­та­ем ска­ляр­ное про­из­ве­де­ние мат­ри­цы с 12 мил­ли­о­на­ми эле­мен­тов с точ­но такой же мат­ри­цей. Очень, очень вычис­ли­тель­но доро­гое удо­воль­ствие.

Что с этим мож­но сде­лать? А, напри­мер, вот что. Мож­но каж­дый пара­метр пред­ста­вить рези­сто­ром. Вход­ное зна­че­ние — подан­ное на него напря­же­ние, вес — про­во­ди­мость. Про­во­ди­мость — вели­чи­на, обрат­ная сопро­тив­ле­нию: G = 1/R или же R = 1/G

А теперь закон Ома:

I = U/R, а R заме­ним 1/G: I = U/(1/G), упро­стим: I = UG. Пода­ём вход­ное напря­же­ние, и меря­ем ток. Вот вам и ска­ляр­ное про­из­ве­де­ние, при­чём чисто ана­ло­го­вы­ми мето­да­ми.

Но хард­вер­ный рези­стор, разу­ме­ет­ся, не очень удоб­но. Зато зна­е­те, что удоб­но? Флеш-память! Флеш пред­став­ля­ет собой мил­ли­ар­ды поле­вых тран­зи­сто­ров с изо­ли­ро­ван­ным затво­ром, веду­щих себя как рези­сто­ры. Изна­чаль­но на них хра­ни­ли толь­ко 0 или 1, ток выше или ниже поро­го­во­го зна­че­ния счи­ты­вал­ся как ноль или еди­ни­ца. Потом сде­ла­ли мно­го­уров­не­вую флеш-память, и на совре­мен­ных твёр­до­тель­ни­ках QLC каж­дая ячей­ка хра­нит аж 16 зна­че­ний (4 бита). Теперь пошли даль­ше, и на этих элек­три­че­ски про­грам­ми­ру­е­мых рези­сто­рах научи­лись про­из­во­дить самые насто­я­щие ана­ло­го­вые вычис­ле­ния, очень инте­рес­ным при­ме­не­ни­ем кото­рых и явля­ют­ся рас­чё­ты ска­ляр­ных про­из­ве­де­ний для рабо­ты ней­ро­се­тей.

Очень, очень инте­рес­ные нын­че вещи при­ду­мы­ва­ют. Как вам такое — рас­чё­ты на жёст­ком дис­ке?

Конеч­но, у подоб­но­го под­хо­да есть недо­стат­ки: более низ­кая точ­ность вычис­ле­ний. Но ней­ро­се­ти, вооб­ще-то и так рабо­та­ют по веро­ят­ност­но­му прин­ци­пу. Какая тебе, в сущ­но­сти, раз­ни­ца, если ней­ро­сеть опре­де­ля­ет фот­ки коти­ков с 99% точ­но­стью или «толь­ко» с 95%?

В‑общем, с инте­ре­сом смот­рю за даль­ней­шим раз­ви­ти­ем собы­тий. Я ней­ро­се­ти уже щупал плот­но несколь­ко раз, мне они очень нра­вят­ся, и я думаю, что если мы когда-нибудь при­ду­ма­ем пол­ный ИИ, имен­но ней­ро­се­ти ста­нут его осно­вой. И не исклю­че­но, что в их осно­ве будут имен­но ана­ло­го­вые вычис­ле­ния. Ну, как у нас в баш­ке.

Игра для мальчишек и дяденек

С огром­ным удо­воль­стви­ем режусь со стар­шим сыном в пре­крас­ную игру Scrap Mechanic. Это, как бы ска­зать, Майн­крафт с инже­нер­ным укло­ном.

Фабу­ла тако­ва: ты совер­ша­ешь ава­рий­ную посад­ку на какой-то пла­не­те с неко­гда высо­ко­раз­ви­той агро­ци­ви­ли­за­ци­ей. Люди на этой пла­не­те прак­ти­че­ски исчез­ли, и оста­лись толь­ко агро­тех­ни­че­ские робо­ты, кото­рые от вре­ме­ни раз­ла­ди­лись и ведут себя, пря­мо ска­жем, непо­до­ба­ю­ще. Напри­мер, норо­вят заса­дить вила­ми пря­мо по баш­ке. Или ско­сить игро­ка огром­ным сер­пом вме­сте с сеном и полить его ядо­хи­ми­ка­та­ми.

Смысл игры в том, что­бы выжить и не уме­реть с голо­ду. Точ­но так же, как и в Майн­краф­те, нуж­но добы­вать себе еду. Съе­доб­ная фау­на хоть и суще­ству­ет (и пред­став­ле­на сим­па­тич­ны­ми коро­ва­ми), но непро­ста в при­го­тов­ле­нии, поэто­му луч­ше скон­цен­три­ро­вать­ся на выра­щи­ва­нии ово­щей. В этом тоже есть свои слож­но­сти: если засе­ять сра­зу слиш­ком боль­шое поле, то набе­гут робо­ты и попы­та­ют­ся все посе­вы уни­что­жить — на этой пла­не­те выра­щи­вать еду раз­ре­ше­но толь­ко авто­ма­там. Боль­шие поля назы­ва­ют­ся «неле­галь­ны­ми» и ночью к тебе при­хо­дит мас­сов­ка робо­тов с целью разо­брать­ся, чьи в лесу шиш­ки. И чем поле боль­ше, и чем более цен­ные ово­щи там выра­щи­ва­ют­ся (напри­мер, очень цен­ны брок­ко­ли), тем более круп­ная и опас­ная тусов­ка к тебе заяв­ля­ет­ся. Поэто­му при­хо­дит­ся выкру­чи­вать­ся: засе­вать мно­го малень­ких полей или же обиль­но удоб­рять поля с целью уско­рить созре­ва­ние ово­щей, что­бы успеть убрать уро­жай до при­бы­тия аграр­ной поли­ции.

Но самый смак игры — в постро­е­нии раз­но­го рода тех­ни­ки: авто­мо­би­лей, гру­зо­ви­ков, тяга­чей, буро­вых уста­но­вок, тан­ков для борь­бы с робо­та­ми, и так далее. Физи­ка в игре сде­ла­на очень непло­хо, и мож­но даже постро­ить лета­ю­щую тех­ни­ку. Но, опять же, из-за непло­хой физи­ки управ­лять ею крайне непро­сто. У меня ушёл битый час, что­бы скон­стру­и­ро­вать квад­ко­птер, на кото­ром я бы не раз­би­вал­ся сра­зу же после взлё­та. И ещё пол­ча­са — что­бы научить­ся более-менее при­ле­тать туда, куда надо мне, а не куда боги при­шлют.

Есть самые раз­ные стро­и­тель­ные бло­ки, из кото­рых мож­но собрать тех­ни­ку: дви­га­те­ли бен­зи­но­вые и элек­три­че­ские, под­шип­ни­ки, порш­ни, фары, тай­ме­ры, тру­бы самых раз­ных длин и ори­ен­та­ций, стек­ла, амор­ти­за­то­ры, шины, опти­че­ские сен­со­ры… Систе­ма краф­тин­га похо­жа на Майн­крафт: что­бы сде­лать тот же амор­ти­за­тор, надо сна­ча­ла добыть желе­зо, кото­рое мож­но либо набу­рить, либо пере­пла­вить неза­дач­ли­во­го робо­та, пред­ва­ри­тель­но огре­то­го по кум­по­лу кувал­дой. Потом из желе­за надо сде­лать сталь, то-есть пона­до­бит­ся уголь. И нуж­на нефть для гид­рав­ли­че­ской жид­ко­сти. Нефть мож­но либо нака­чать в пустыне, либо достать со дна моря.

Но и это ещё не всё. В игре есть пара момен­тов, кото­рые дела­ют её инте­рес­ной не толь­ко маль­чиш­кам, но и дядень­кам с выс­шим ком­пью­тер­ным обра­зо­ва­ни­ем. Так, в игре есть логи­че­ские эле­мен­ты, что зна­чит, что на их базе мож­но постро­ить ком­пью­тер. Вот, напри­мер, я постро­ил дво­ич­ный вось­ми­бит­ный сум­ма­тор с после­до­ва­тель­ным пере­но­сом. Скла­ды­ва­ют­ся чис­ла 163 и 29 (10100011 и 00011101 соот­вет­ствен­но). Резуль­тат, конеч­но, 192 (11000000).

Конеч­но, мож­но не толь­ко скла­ды­вать, но и вычи­тать. Разу­ме­ет­ся, ком­пью­те­ры вычи­тать не уме­ют. Когда ком­пью­те­ры вычи­та­ют, напри­мер, 29 из 163, они скла­ды­ва­ют 163 и ‑29. В дво­ич­ной систе­ме, что­бы полу­чить отри­ца­тель­ное чис­ло, надо все биты пере­вер­нуть и доба­вить еди­ни­цу. Так что скла­ды­ва­ем 10100011 и 11100011 и полу­ча­ем 10000110 (134). Ну, а гроз­но горя­щий крас­ным инди­ка­тор пере­пол­не­ния игно­ри­ру­ем…

Эле­мен­ты сум­ма­то­ра — пять логи­че­ских эле­мен­тов: два XOR, два AND и один OR. Про­ще не при­ду­ма­лось.

В‑общем, в игре каж­дый может най­ти что-то своё, инте­рес­ное лич­но ему. Кто-то любит драть­ся с робо­та­ми. Кто-то стро­ит огром­ные мощ­ные седель­ные тяга­чи. Дру­гой — авто­ма­ти­зи­ру­ет выра­щи­ва­ние ово­щей. Ну, а кто-то рису­ет логи­че­ские цепи в твор­че­ском режи­ме — точ­но такой же режим есть в Майн­краф­те. В нём нет вра­гов, и доступ­ны все стро­и­тель­ные бло­ки. Раз­вле­кай­ся как хочешь.

Крайне реко­мен­дую, игра нахо­дит­ся в актив­ной раз­ра­бот­ке (т.н. early access), но уже сто­ит того, что­бы её купить. Есть на Сти­ме.

Что делать дураку

Я очень хре­но­во играю в игры, кото­рые тре­бу­ют постро­е­ния глу­бо­ко­го дере­ва реше­ний. Напри­мер, в шах­ма­ты. Даже на неболь­шой слож­но­сти прак­ти­че­ски любая шах­мат­ная про­грам­ма меня наги­ба­ет. Вот поче­му-то мне это не даёт­ся, и нико­гда не дава­лось. Боль­ше ска­жу — мне настоль­ко непри­ят­но пытать­ся заста­вить мой мозг учить­ся это делать, что ско­рее все­го, я нико­гда это­му искус­ству и научусь.

То же самое каса­ет­ся реше­ния каких-то мате­ма­ти­че­ских голо­во­ло­мок. Каким-то хит­рым обра­зом сло­жить вме­сте циф­ры, что­бы полу­чить что-то нуж­ное у меня про­сто не полу­ча­ет­ся. Какие-нибудь судо­ку, напри­мер. Нена­ви­жу их.

Но зато я могу напи­сать алго­ритм, кото­рый любую из подоб­ных задач реша­ет за доли секун­ды. Любые самые зубо­дро­би­тель­ные судо­ку я могу решить за 0.24 секун­ды (засе­кал, про­грам­ма на Джа­ве). Инте­рес­но даже, что те судо­ку, что счи­та­ют­ся наи­бо­лее слож­ны­ми для чело­ве­ка, про­грам­ма реша­ет быст­рее, чем те, кото­рые счи­та­ют­ся про­сты­ми. Види­мо, что про­сто для чело­ве­ка, слож­но для ком­пью­те­ра, и наобо­рот.

Натолк­нул­ся на подоб­ную задач­ку у avva. Берём четы­ре задан­ных чис­ла. Мож­но пере­став­лять их как хочет­ся. Из инстру­мен­тов — все четы­ре дей­ствия ариф­ме­ти­ки и скоб­ки. Сум­ма долж­на полу­чить­ся 24.

Про­стая задач­ка:

2,3,3,6

2 * 3 * 3 + 6 = 24

Слож­ная задач­ка:

1, 3, 4, 6

6 / (1 — 34) = 6÷(1÷4) = 6×4 = 24

Вы дума­е­те, я рука­ми решал? Да ну нахер такое, нена­ви­жу.

Это менее 20 стро­чек на Питоне (на чём же ещё, если надо быст­ро):

from itertools import permutations

all_numbers = ['1','3','4','6']
all_actions = ['*','/','+','-']
all_parens = [['','','','','',''],['(','',')','','',''],['','(','','',')',''],['','','','(','',')'],['(','','','',')',''],['','(','','','',')'],['(','',')','(','',')']]

numbers = list(permutations(all_numbers))

for number in numbers:
	for i in range(0,len(all_actions)):
		for j in range(0,len(all_actions)):
			for k in range(0,len(all_actions)):
				for parens in all_parens:
					try:
						if (eval(parens[0] + number[0] + all_actions[i] + parens[1] + number[1] + parens[2] + all_actions[j] + parens[3] + number[2] + parens[4] + all_actions[k] + number[3] + parens[5]) == 24):
							print(parens[0] + number[0] + all_actions[i] + parens[1] + number[1] + parens[2] + all_actions[j] + parens[3] + number[2] + parens[4] + all_actions[k] + number[3] + parens[5])
							quit()	
					except ZeroDivisionError as e:
						print(e)

Не полу­чи­лось толь­ко как-то алго­рит­ми­зи­ро­вать созда­ние ско­бок. Скоб­ки, они, блин, хит­рые. ()(), напри­мер, не палин­дром. А ())( — палин­дром. Поэто­му в лоб напи­сал все воз­мож­ные вари­ан­ты, бла­го, их немно­го.

Что делать дура­ку? Писать алго­рит­мы!!!

Аффтопрограммирование

В авто­мо­би­ли уже дав­но ста­вят ком­пью­тер с бор­то­вой само­ди­а­гно­сти­кой. До 1996 года еди­но­об­ра­зия рабо­ты с этим ком­пью­те­ром не было, а теперь вез­де мож­но с ним пого­во­рить по набо­ру стан­дар­тов OBD2. Рань­ше ска­не­ры, обща­ю­щи­е­ся с диа­гно­сти­че­ской систе­мой, были дико доро­ги­ми, но теперь цена ста­ла более демо­кра­тич­ной, и самые про­стень­кие мож­но купить монет за 20, а то и ещё дешев­ле. Одна­ко дешё­вые ска­не­ры име­ют крайне огра­ни­чен­ные воз­мож­но­сти, и спо­соб­ны толь­ко на самые при­ми­тив­ные дей­ствия — про­смотр диа­гно­сти­че­ских кодов (дале­ко не всех), их сти­ра­ние. Если же тебе нуж­на диа­гно­сти­ка чего-то более слож­но­го, при­дёт­ся серьёз­но рас­ко­ше­лить­ся. Вот, напри­мер, возь­мём такую рас­про­стра­нён­ную вещь как диа­гно­сти­ка ката­ли­за­то­ра. Когда у тебя выла­зит код диа­гно­сти­ки P0420, при­чи­ны для него могут быть самые раз­ные. Может быть, дат­чик кис­ло­ро­да подох. А может быть, и ката­ли­за­тор. Ведь как воз­ни­ка­ет этот код? У тебя сто­ят два дат­чи­ка кис­ло­ро­да — один ДО, дру­гой ПОСЛЕ ката­ли­за­то­ра (в маши­нах, кото­рые дизай­ни­ли пида­ра­сы в пло­хом смыс­ле сло­ва, их аж четы­ре — см. Нис­сан). Код ошиб­ки гене­ри­ру­ет­ся когда пока­за­ния этих дат­чи­ков ОДИНАКОВЫЕ. Что логич­но — это озна­ча­ет, что ката­ли­за­тор ниче­го не дела­ет.

Что­бы одно­знач­но понять, надо ли менять ката­ли­за­тор, надо пока­за­ния этих дат­чи­ков пред­ста­вить гра­фи­че­ски. Какие пока­за­ния будут у них до того, как ката­ли­за­тор про­гре­ет­ся до рабо­чих тем­пе­ра­тур. Какие после. Пока­за­ния дат­чи­ка ДО ката­ли­за­то­ра долж­ны менять­ся, и доволь­но силь­но. Пока­за­ния дат­чи­ка ПОСЛЕ ката­ли­за­то­ра долж­ны оста­вать­ся посто­ян­ны­ми. Уви­дев всё это, лег­ко понять, что про­ис­хо­дит. Но ска­нер OBD2, спо­соб­ный стро­ить гра­фи­ки, уже недё­шев — от 150 монет и выше.

Что мож­но сде­лать, если у тебя руки рас­тут из (наде­юсь) отно­си­тель­но пра­виль­ных мест? Мож­но купить ком­пью­тер­ный адап­тер на чипе ELM327, кото­рый под­клю­ча­ет­ся через USB и ста­но­вит­ся в ком­пью­те­ре допол­ни­тель­ным COM-пор­том. Они недо­ро­гие — за 10 монет мож­но купить. Затем берём любую тер­ми­нал­ку, и цеп­ля­ем­ся к это­му пор­ту, выста­вив ско­ро­сти от 9600 до 38400 и 115200 (зави­сит от кон­крет­но­го адап­те­ра). И раз­го­ва­ри­ва­ем с ним как с обык­но­вен­ным моде­мом. Ага. Он даже коман­дой ATZ ресе­тит­ся 🙂

Вот так, напри­мер:

OKL1 это на самом деле OK, выдан­ное моде­мом на коман­ду ATL1 (вклю­ча­ю­щую добав­ле­ние CR в отве­ты). Ина­че чело­ве­ку неком­форт­но.
AT@1 это запрос «ты кто такой», типа ATI7 на моде­мах US Robotics 🙂

Таким обра­зом мож­но дать коман­ды под­це­пить­ся к авто­мо­биль­но­му ком­пью­те­ру и рас­ска­зать тебе всё, что инте­рес­но. Толь­ко вот выда­вать­ся оно будет в шест­на­дца­ти­рич­ных кодах, что неудоб­но.

Суда­ри мои, за что мы любим язык про­грам­ми­ро­ва­ния Питон? Я вот рань­ше его недо­люб­ли­вал, а потом оце­нил по досто­ин­ству. Язык Питон мы любим за то, что на нём мож­но решить прак­ти­че­ски любые при­клад­ные зада­чи если исполь­зо­вать соот­вет­ству­щие биб­лио­те­ки; ибо кто-то с такой про­бле­мой уже, ско­рее все­го, стал­ки­вал­ся.

Суще­ству­ет спе­ци­аль­ная биб­лио­те­ка Python-OBD, в кото­рой вся эта рас­шиф­ров­ка шест­на­дца­ти­рич­ной бре­дя­ти­ны уже напи­са­на, тебе оста­ёт­ся толь­ко её взать и нари­со­вать, что тебе надо. В част­но­сти, оно может выда­вать зна­че­ния напря­же­ния, выда­ва­е­мо­го дат­чи­ка­ми кис­ло­ро­да. Оста­ёт­ся сунуть эти зна­че­ния в спи­сок (во что же ещё), после чего скор­мить его matplotlib.pyplot, и пред­ста­вить гра­фи­че­ски хоть чор­та бри­то­го, при­чём ров­но так, как тебе надо.

Ну, а те, у кого с про­грам­ми­ро­ва­ни­ем не очень, могут при­об­ре­сти ком­мер­че­ские про­грам­мы, рабо­та­ю­щие с адап­те­ра­ми на ELM327. Их мно­го вся­ких, и они недо­ро­гие — вся­ко дешев­ле 150 дол­ла­ров.

Надо ещё ска­зать, что тут есть заса­да. Стан­дарт­ные OBD2 коды хоро­шо доку­мен­ти­ро­ва­ны. Но есть и спе­ци­аль­ные, про­при­е­тар­ные коды, для каж­дой мар­ки свои, и про­из­во­ди­те­ли не спе­шат их опи­сы­вать и выкла­ды­вать опи­са­ние в откры­тый доступ. Надо же как-то заста­вить юзве­рей уша­стых поку­пать обслу­жи­ва­ние в дилер­ши­пах. Но есть недо­ро­гие про­грам­мы, кото­рые под­дер­жи­ва­ют и эти коды. Так, для БМВ есть Bimmerscan, а для Фор­дов есть Forscan, при­чём на него бес­плат­но дают проб­ную лицен­зию на два меся­ца. Кро­ме того, Forscan рабо­та­ет и не с Фор­да­ми, про­сто он не под­дер­жи­ва­ет спе­ци­аль­ные коды диа­гно­сти­ки для авто­мо­би­лей дру­гих про­из­во­ди­те­лей.

Ну, а мой ката­ли­за­тор ока­зал­ся в поряд­ке. Это про­сто я по луже удач­но про­ка­тил­ся — ката­ли­за­тор остыл до нера­бо­чей тем­пе­ра­ту­ры, и вре­мен­но пере­стал рабо­тать.

PS: Хех, вот уж не думал, что теги «авто­мо­би­ли» и «про­грам­ми­ро­ва­ние» когда-нибудь встре­тят­ся.

Компьютерное

Про­ап­грей­дил жёст­кий диск в ком­пью­те­ре. Был 1 «тера­байт», ста­ло 2. В кавыч­ках пото­му что про­из­во­ди­те­ли исполь­зу­ют аль­тер­на­тив­ную мате­ма­ти­ку — 1 тера­байт у них это 1000 гига­байт, а не 1024.

Тупо пере­ки­нул всё Акро­ни­сом, бла­го с твёр­до­те­ла на твёр­до­тел всё копи­ру­ет­ся момен­таль­но. Лет 10 назад я бы всё пере­ста­вил нахер с нуля, а щас настоль­ко лени­во всё это делать! Это что же, все про­грам­мы с нуля пере­уста­нав­ли­вать, все игры, все настрой­ки? Нафиг-нафиг.

А ещё я сде­лал одну вещь, кото­рую тоже не стал бы делать 10 лет назад. Купил игро­вой ноут­бук MSI. Это рань­ше я думал (оши­боч­но), что Ком­пью­те­ры долж­ны быть Боль­шие и Желез­ные, а теперь я ниче­го тако­го предо­су­ди­тель­но­го в ноут­бу­ках не вижу. Ноут­бук не силь­но выпенд­рёж­ный, но в нём сто­ит Нви­дия 2060, ничуть не мень­ше по мощ­но­сти, чем 1070 GTX, что сто­ит в ста­ци­о­нар­ном ком­пе. Игры идут заме­ча­тель­но. Да и всё осталь­ное тоже.

Май­к­ро­софт, нако­нец-то, блин, решил дав­но суще­ству­ю­щую про­бле­му: как полу­чить ком­пью­тер, кото­рый может одно­вре­мен­но играть в игры, и рабо­тать с соф­том под Линукс, кото­ро­му нуж­на CUDA, и что­бы без уста­нов­ки двух ОС в мно­го­за­гру­зоч­ной кон­фи­гу­ра­ции. Я уже дав­но исполь­зую WSL (Windows Subsystem for Linux). Это поз­во­ля­ет посто­ян­но иметь под рукой Линукс, на кото­ром мож­но раз­ра­ба­ты­вать софт, не отхо­дя от кас­сы. Не надо путать WSL с Cygwin — WSL это пол­но­цен­ный линукс, запус­ка­ю­щий линук­со­вые же бинар­ни­ки, а не пере­ком­пи­ли­ро­ван­ный в экзеш­ни­ки линук­со­вый софт. Ещё в нём удоб­но обме­ни­вать­ся фай­ла­ми с линук­со­вой под­си­сте­мой — ибо WSL созда­ёт скры­тую шару \\wsl$, из кото­рой ты име­ешь воз­мож­ность обра­щать­ся напря­мую к / в линук­со­вой вир­ту­ал­ке.

Так вот, выяс­ни­лось, что начи­ная с WSL вер­сии 2, ресур­сы гра­фи­че­ско­го про­цес­со­ра нор­маль­но про­ки­ды­ва­ют­ся к госте­вой ОС, так что там мож­но запус­кать TensorFlow, Caffe, и про­чие инте­рес­ные вещи без того, что­бы тор­мо­зить и всё выпол­нять на цен­траль­ном про­цес­со­ре. Так что впер­вые, блин, мож­но и на ёлку залезть и не оца­ра­пать­ся. Рань­ше подоб­ные зада­чи реша­лись уста­нов­кой Линук­са в каче­стве основ­ной ОС, и водру­же­ни­ем на него систе­мы вир­ту­а­ли­за­ции Xen, кото­рая запус­ка­ла маши­ну с Вин­до­уз, в кото­рой уже мож­но было запус­кать игры, ибо Xen уме­ет про­бра­сы­вать GPU до госте­вой ОС.

Конеч­но, есть неболь­шая поте­ря про­из­во­ди­тель­но­сти и в том, и в дру­гом слу­чае. Но поте­ря про­из­во­ди­тель­но­сти на 10% в играх — намно­го замет­нее, чем поте­ря про­из­во­ди­тель­но­сти на 10% при испол­не­нии TensorFlow. Так что как ни кру­ти, а всё же в этом отно­ше­нии Вин­до­уз луч­ше Линук­са.

Доломал минимакс

Вот мно­гие счи­та­ют, на мой взгляд, необос­но­ван­но, что маши­на, создан­ная чело­ве­ком, завсе­гда будет дур­нее созда­те­ля. По мое­му опы­ту, вер­но обрат­ное — создан­ный чело­ве­ком иску­ствен­ный интел­лект (ого­во­рюсь сра­зу, для дан­ной кон­крет­ной опре­де­лён­ной зада­чи — т.н. «сла­бый» ИИ) рабо­та­ет намно­го мощ­нее, чем спо­со­бен чело­век, его напи­сав­ший. Во вся­ком слу­чае, мои кре­сти­ки-ноли­ки лег­ко меня гро­мят, если толь­ко я не намор­щу ум — тогда полу­ча­ет­ся ничья. Да и Deep Blue, кото­рый обыг­рал Кас­па­ро­ва, писа­ли хоть и люди, заве­до­мо зна­ко­мые с шах­ма­та­ми, но всё же не игро­ки выше уров­ня вели­ко­го шах­ма­ти­ста.

Поэто­му, так ска­зать, в даль­ней пер­спек­ти­ве я вижу, что чело­век смо­жет создать силь­ный иску­ствен­ный интел­лект, кото­рый пре­во­зой­дёт его само­го. Вопрос, какая роль будет отве­де­на чело­ве­ку в дан­ном мире — ОЧЕНЬ инте­рес­ный, и по-мое­му, одно­знач­но­го отве­та нет ни у кого. Элон Маск, напри­мер, счи­та­ет, что чело­ве­че­ство будет пора­бо­ще­но силь­ным ИИ. Созда­те­ли сери­а­ла «Person of Interest» дума­ют, что чело­век будет суще­ство­вать с силь­ным ИИ сим­био­ти­че­ски — т.е. всё управ­ле­ние и раз­ви­тие чело­ве­че­ства возь­мёт на себя ИИ, люди будут абсо­лют­но счаст­ли­вы, а в обмен на это будут этот самый ИИ обслу­жи­вать, напри­мер, бата­рей­ки вовре­мя менять 🙂 Ну, а созда­те­ли сери­а­ла «Westworld» отво­дят ИИ роль рабов, при­служ­ни­ков чело­ве­ка. Какой из этих отве­тов вер­ный — неиз­вест­но, но не исклю­че­но, что ответ мы узна­ем в тече­ние нашей жиз­ни.

Одна­ко хва­тит фило­со­фии.

Вся зада­ча напи­са­ния игры, спо­соб­ной обыг­рать созда­те­ля, в ито­ге таки све­лась к напи­са­нию алго­рит­ма мини­макс. В этом была вся загвозд­ка. Попы­та­юсь объ­яс­нить попро­ще, как он рабо­та­ет.

Для каж­до­го потен­ци­аль­но­го хода нуж­но рас­счи­тать некий коэф­фи­ци­ент. Отри­ца­тель­ный коэф­фи­ци­ент будет озна­чать, что выиг­рал про­тив­ник, поло­жи­тель­ный — что выиг­ра­ла про­грам­ма. Я начал с того, что при­сво­ил немед­лен­но­му выиг­ры­шу зна­че­ние 1.0, про­иг­ры­шу ‑1.0, а ничьей 0. Далее, алго­ритм поме­ча­ет этот ход как кор­не­вой узел, и стро­ит исхо­дя­щее из него дере­во потен­ци­аль­ных ходов про­тив­ни­ка, а потом сно­ва сво­их, вызы­вая сам себя рекур­сив­но (а как же ещё, если речь идёт о дере­вьях про­из­воль­ной высо­ты). Рань­ше или поз­же, алго­ритм добе­рёт­ся до листьев игро­во­го дере­ва, и будет воз­вра­щать +1.0, ‑1.0 или 0. Оста­ёт­ся толь­ко сло­жить все зна­че­ния, полу­чен­ные из листьев игро­во­го дере­ва, вме­сте, и запи­сать их в мас­сив, из кото­ро­го выбрать мак­си­маль­ное зна­че­ние, при­сво­ен­ное како­му-либо ходу.

Но это­го ока­за­лось недо­ста­точ­но. Напи­сан­ная с таким алго­рит­мом про­грам­ма таки игра­ла, но на сред­нем уровне. У неё мож­но было выиг­рать. Шишеч­кой на этой ёлоч­ке ока­за­лось вве­де­ние допол­ни­тель­ной поправ­ки, на кото­рую умно­жал­ся коэф­фи­ци­ент, полу­чен­ный из листьев игро­во­го дере­ва. По про­стой при­чине — немед­лен­ный выиг­рыш или про­иг­рыш, пря­мо со сле­ду­ю­ще­го хода, дол­жен учи­ты­вать­ся зна­чи­тель­но боль­ше, чем выиг­рыш или про­иг­рыш после несколь­ких ходов. Я начал с того, что коэф­фи­ци­ен­ты, полу­чен­ные из каж­до­го более ниж­не­го уров­ня игро­во­го дере­ва, стал делить на 2. Но и это­го ока­за­лось мало, хотя и замет­но улуч­ши­ло рабо­ту алго­рит­ма. Маги­че­ским чис­лом ока­за­лось 4. Т.е. немед­лен­ный выиг­рыш на пер­вом ходе учи­ты­ва­ет­ся как +1.0, выиг­рыш на вто­ром — как +0.25, на тре­тьем — +0.0625 и так далее. Вот тут уже выиг­рать про­тив про­грам­мы не ока­за­лось ника­ких шан­сов. В луч­шем слу­чае я могу сыг­рать вни­чью.

Сме­ха ради, запу­стил про­грам­му играть про­тив гуг­лов­ских кре­сти­ков-ноли­ков на уровне слож­но­сти impossible. Все игры так же были све­де­ны к ничьей. Уррр­ря!!

Надо будет напи­сать про­грам­му, игра­ю­щую в пре­фе­ранс. А то комп меня лег­ко дрю­чит, осо­бен­но на рас­па­сах (я вооб­ще не очень играю ни в пре­фе­ранс, ни в шах­ма­ты, ни в шаш­ки, хотя поче­му-то непло­хо — в под­дав­ки).

IT-гримасы кризиса

Все пом­нят Y2K? Тогда огром­ное коли­че­ство суще­ству­ю­щих госу­дар­ствен­ных систем потре­бо­ва­ли пере­пи­сы­ва­ния, так как они некор­рект­но отра­ба­ты­ва­ли дву­знач­ные даты. Огром­ное коли­че­ство этих при­ло­же­ний были созда­ны в 1970–80е на Кобо­ле, и вне­зап­но про­грам­ми­сты на Кобо­ле ока­за­лись дико вос­тре­бо­ван­ны­ми.

Теперь в свя­зи с вирус­ным кри­зи­сом мы ока­за­лись в той же ситу­а­ции — эти госу­дар­ствен­ные ком­пью­тер­ные систе­мы нику­да не делись, но из-за огром­но­го наплы­ва тех же без­ра­бот­ных, пода­ю­щих на посо­бия, они не справ­ля­ют­ся с нагруз­кой. Штат Нью-Джер­си ищет про­грам­ми­стов с опы­том про­грам­ми­ро­ва­ния на Кобо­ле, почи­нить их древ­нюю систе­му обра­бот­ки заяв­ле­ний на полу­че­ние посо­бий.

Прав­да, ищут они волон­тё­ров, то-есть, пред­ла­га­ют рабо­тать за бес­плат­но, так что #goodluckwiththat

И не вполне понят­но, чего они хотят почи­нить. Древ­ний мейн­фрейм, хоть ты про­грам­му обпе­ре­пи­сы­вай­ся, быст­рее рабо­тать не ста­нет.

Погля­дел я этот Кобол, кста­ти. Дико раз­дра­жа­ет его мно­го­слов­ность. Даже в таких про­стых вещах как опе­ра­то­ры срав­ни­ва­ния. Чего сто­ит, напри­мер, усло­вие «A не рав­ня­ет­ся B». На Сях оно про­сто: A != B. А на Кобо­ле надо писать A IS NOT = B. Ага, вот так, знай наших! Мы не как дру­гие вся­кие! Меня, кста­ти, то же самое раз­дра­жа­ет в Повер­шел­ле. Там нель­зя напи­сать A > B. Надо писать A ‑gt B. Дичь какая-то. Созда­те­лем Кобо­ла, кста­ти, явля­ет­ся жен­щи­на, и я не хочу пока­зать­ся сек­си­стом — но может быть эта мно­го­слов­ность отту­да?

Про 42

Хотел напи­сать про то, как мне лич­но было непо­нят­но, чем так гор­дит­ся груп­па иссле­до­ва­те­лей Мас­са­чус­сет­ско­го Тех­но­ло­ги­че­ско­го, кото­рая нашла зна­че­ния x, y, и z, при кото­рых x3 + y3 + z3 = 42.

Набро­сал для рас­чё­тов свою про­гу на Джа­ве. И не могу ска­зать, что она не рабо­та­ла. Она пре­крас­но рабо­та­ла для мно­гих цифр, в том чис­ле, и для люби­мо­го чис­ла Шел­до­на Купе­ра (73). Но даль­ше, имея на руках поряд­ки полу­чен­ных в MIT цифр для 42, при­ки­нул вычис­ли­тель­ную слож­ность, и охре­нел — т.к. решать дан­ную про­бле­му, как гово­рит­ся, «в лоб» на самом уль­тра­со­вре­мен­ном супер­ком­пью­те­ре с его дву­мя сот­ня­ми петафлоп­сов с лихе­ром при­дёт­ся э.… не намно­го мень­ше, чем воз­раст наблю­да­е­мой Все­лен­ной.

Усты­дил­ся, пошёл читать про алго­ритм, кото­рым рань­ше было реше­но урав­не­ние x3 + y3 + z3 = 33. Ока­за­лось, что там, мяг­ко гово­ря, очень не в лоб реша­ли. Усты­дил­ся окон­ча­тель­но. Полез­но вот так ино­гда, рожей об стол, для скром­но­сти и сми­рен­но­сти.

Вопросы на интервью, помощь зала

Мне надо будет нанять сисад­ми­на; но так как мы теперь семи­миль­ны­ми шага­ми идём в обла­ко, от сисад­ми­на теперь тре­бу­ет­ся опыт про­грам­ми­ро­ва­ния. Не силь­но углуб­лён­но­го, но надо, что­бы чело­век пони­мал осно­вы напи­са­ния скрип­тов.

Сижу чешу репу над спис­ком вопро­сов.

Мне, повто­рюсь, не надо, что­бы чело­век знал, напри­мер, какой кон­крет­но коман­дой мож­но полу­чить мас­сив объ­ек­тов ком­пью­те­ров из AD — это лег­ко гуг­лит­ся. Надо понять, уме­ет ли чел вооб­ще в осно­вы погро­ми­ро­ва­ния. Пусть пишет хоть на Питоне, хоть на псев­до­ко­де, мне похер.

1. Если нуж­но совер­шить одно и то же дей­ствие пять раз, как это луч­ше все­го сде­лать внут­ри скрип­та?
2. Если мне надо полу­чить про­ну­ме­ро­ван­ный спи­сок всех ком­пью­те­ров в домене, как про­ще все­го это сде­лать?
3. Нуж­но напи­сать скрипт, кото­рый будет посы­лать изве­ще­ние сисад­ми­ну, если в домене появят­ся учёт­ные запи­си, пароль кото­рых нико­гда не исте­ка­ет. Как это луч­ше все­го напи­сать?
4. if (a = 0) { .. } — поче­му дан­ное усло­вие либо не рабо­та­ет вооб­ще, либо не рабо­та­ет пра­виль­но?

Какие ещё будут пред­ло­же­ния?

Компьютер всё делает лучше

Нашёл тут задач­ку судо­ку, типа, самая слож­ная в мире.

https://gizmodo.com/can-you-solve-the-10-hardest-logic-puzzles-ever-created-1064112665

Нуи­чо, моя джа­вов­ская решал­ка рас­пра­ви­лась с ней за 0.1 секун­ды. Нифи­га она не слож­ная.

Ско­рее все­го, «слож­ной» она явля­ет­ся толь­ко пото­му, что решить её логи­че­ски очень слож­но, а вот пере­бо­ром — пожа­луй­ста. Уди­ви­тель­но толь­ко что самые раз­но­об­раз­ные задач­ки судо­ку моя про­грам­ма реша­ет в сред­нем за 2 секун­ды, а тут полу­чи­лось зна­чи­тель­но быст­рее. Види­мо, то, что зато­че­но под логи­ку, слож­нее для ком­пью­те­ра, и наобо­рот, то, что чело­ве­че­ский мозг ста­вит раком, для ком­пью­те­ра ерун­да.