13/03/2019

Git: базовые функции или как не потерять лицо перед коллегами (введение, клонирование)


"Repository — a place where things are or may be reposited,
or laid up, for safety or preservation."
Daniel Webster 1913 dictionary

Git.1: введение, клонирование
Предупреждение: эта заметка будет объёмнее, чем последующие, так как здесь будут даны общие данные и расписаны некоторые понятия. Наберитесь терпения.

Серия статей «Git: базовые функции или как не потерять лицо перед коллегами» является памяткой для тех, кто периодически забывает о том, как работать с Git'ом в редко возникающих ситуациях или никогда не работал и нуждается в коротких подсказках как работать с этой системой в объёме ежедневных/еженедельных операций с репозиториями. Так же эти заметки могут служить инструкцией для быстрого начала работы с Git'ом для новичков и студентов.
Сам я ощутил потребность в подобном источнике информации, когда я устроился на новую работу, в достаточно большой коллектив, где Git действительно использовался для командной работы, а не как система архивирования, что не редко встречается. Меня хотели быстро подключить к проекту, сказали забрать репозиторий и прислали ссылку на него. А я не только не помнил, что с этим делать - я даже не мог вспомнить, когда выкачивал репозиторий в последний раз! В памяти всплывали только команды commit и push (это мы делаем несколько чаще, чем выкачиваем репозитории). Я с ужасом осознал, что это — всё, что я знаю о Git'е на данный момент. Тут я подумал, что хорошо бы было иметь памятки, неглубокие, но содержащие нужный минимум, и в которые можно было бы заглядывать по мере необходимости. Это и побудило меня записать и опубликовать информацию для коллег. 
Кому ещё могут быть полезны эти заметки?

  • Руководителю, которому нужно иногда смотреть, что происходит с кодовой базой в отделе или проекте.
  • Тем, у кого имел место отпуск или другой перерыв в работе.
  • Тем, кому надо подготовиться к зачёту или к защите своего первого диплома в техническом ВУЗе.

Знакома какая-то из вышеописанных ситуаций? Тогда читайте — это для вас.

Перед тем как начать, укажу общие сведения:
  • Для примеров я буду использовать сервис GitLab. Почему я выбрал его? Потому что этот продукт включает в себя Git-сервер и достаточно серьёзную надстройку над ним в виде bug-, issue-трекинга и иных инструментов. Если мы в этих заметках будем касаться какого-то функционала этого сервиса (помимо самого Git'а) — знакомство с ним будет плюсом вашей (и моей) карьере, так как GitLab нередко используется как внутрикорпоративная система во многих компаниях (даже в IBM, Sony и NASA!).
  • Для доступа к моим учебным репозиториям не будет запрошен пользователь и пароль - все они настроены как «публичные».
  • Структура этих заметок будет примерно следующая: описание рассматриваемой проблемы или постановка задачи, её решение в простых терминах, затем, опционально: заметки о дополнительных нюансах, потенциальных ошибках, возможностях и более подробная техническая информация.
  • Прошу вас сообщать мне о допущенных ошибках или упущениях (терминология, аспекты, и пр.). Не стесняйтесь задавать дополнительные вопросы. Так же буду благодарен за предложения тем, которые вы считаете уместным рассмотреть.
Начнём с самого первого нашего контакта с системой Git — как скачать репозиторий?

git clone https://gitlab.com/daftsoft/StartProject.git

Эта команда создаст каталог с названием проекта без расширения (.git), в нашем случае — StartProject, и скачает последнюю версию репозитория в этот каталог.

NB!
В терминологии (и в идеологии) Git'а скачивание репозитория называется «клонированием». Впрочем, не во всех коллективах используют этот термин, нередко говорят «скачать».

NB!
Если вас не устраивает имя проекта по-умолчанию (имя проекта Git'а без .git), вы можете склонировать репозиторий в каталог с указанным именем:

git clone https://gitlab.com/daftsoft/StartProject.git LocalProjectDirectory


Если в проекте есть субмодули (уточните это у старших в отделе или у начальника/руководителя), нужно использовать ключ --recurse-submodule

git clone https://gitlab.com/daftsoft/StartProject.git --recurse-submodules

Если нужно забрать один субмодуль, например, если в проекте их очень (слишком) много, то из каталога, где лежит репозиторий выполнить:

git submodule init
git submodule update --remote Submodule (Submodule — имя субмодуля)

Подробнее о том, что такое субмодуль мы поговорим в следующих выпусках.

Всё. Вы можете начинать работать с кодом — изучать, компилировать, отлаживать.

Git может работать по двум протоколам — https и ssh.
Примеры ссылок (адресов репозиториев): 

HTTPS:
https://gitlab.com/daftsoft/StartProject.git
SSH:
git@gitlab.com:daftsoft/startproject.git

NB!
Потенциальная почва для ошибок, которые трудно заметить.
Обратите внимание на то, что разделители в адресах с разными протоколами разные. Нетрудно ошибиться и долго ломать голову — почему же Git не выкачивает репозиторий, а только пишет fatal, fatal, fatal...
.git на конце ссылки консольный Git добавляет сам — её можно опустить.

NB!
Вы уже могли догадаться, что Git должен где-то хранить служебную информацию — историю изменений, авторов и прочее. Да, вся служебная информация Git'а хранится в каталоге .git («скрытый» каталог в UNIX-системах). Каталог, в котором расположен .git называется git-директорией. Пока (а лучше никогда) залезать в него не надо — и у вас всё будет работать.


В следующей заметке мы рассмотрим как заливать свои изменения в репозиторий.

20/05/2005

Ретро-статья: про «уровни» языков программирования и assembler

Эта статья является вводной в курс языка программирования низкого уровня Assembler (далее — Asm). Так как эта статья вводная, мы ограничимся весьма поверхностной информацией и общими сведениями. 

Было бы логично начать с определения, что мы будем принимать за низкий уровень, а что — за высокий. Языки программирования делятся на низкоуровневые и высокоуровневые. В данном случае подразумевается степень приближённости языка программирования к языку человеческому (а так же отдалённость его от машинного языка). Дело в том, что процессор работает по своим принципам, и общаться с ним можно только на его языке. Следовательно, самый низкоуровневый язык — это язык машинного кода, так как он является родным для процессора и находится дальше всего от человеческого языка. Следующим по высоте является язык Asm, поскольку Asm представляет собою мнемонику, набор легко запоминаемых обозначений (легко запоминаемых, относительно самого машинного кода). То есть Asm оперирует напрямик с процессором и его командами. Дальше стоят языки высокого уровня, такие как BASIC, Pascal, C/C++, Fortran. И на последней ступени, на данный момент, стоят RAD системы (Rapid Application Development — быстрая разработка приложений). Такие как Visual BASIC, Visual С#, Delphi и прочие, как правило визуальные. Сейчас RAD системы принято называть «студиями», так как фирмы выпускают именно студии, визуальные, содержащие большинство распространенных языков. В наше время можно наблюдать две основные студии — Borland Developer Studio и Microsoft Visual Studio. Borland Developer Studio включает в себя Delphi (язык на основе Pascal, который в процессе эволюции получил название Delphi Language) и C#. Отдельно поставляется версия RAD системы на основе C++ — C++ Builder. Но есть вероятность что фирма Borland в ближайшем будущем совместит две эти студии в одну. Microsoft Visual Studio включает в себя Visual BASIC, Visual C++ и Visual C#. Работа в студии наиболее похожа на обычное межличностное человеческое общение, на языке напоминающем человеческий (а во многих случаях и вовсе прямо сводится к тырканью мышью по различным областям экрана). 

Не сложно предположить, что всякая программа в конечном счёте всё равно будет переведена на язык процессора. Процесс перевода с человеческого языка на машинный называется трансляцией. Процесс построения программы — это трансляция, — преобразование программы в набор объектных файлов, содержащих машинный код, и линковка — объединение объектных файлов в результирующий исполняемый файл под данную конкретную операционную систему. Если мы пишем на машинном языке, нам не требуется ничего компилировать, достаточно всего лишь сохранить в файл и можно запускать. Компиляция с Asm'а — это всего лишь последовательный перевод одной команды Asm'а в определённый набор команд процессора. Компиляция программы на Asm'е подобна переводу с Американского на Британский. В то время как компиляция с языка высокоуровневого напоминает скорее перевод с иероглифов, русского или иврита, на, допустим, тот же Британский. 

Уровень языка также отвечает за то, насколько процесс разработки, компиляции и сборки финальной программы контролируется разработчиком. То есть, программисты на машинном коде и на Asm'е полностью контролирует процесс работы своей программы. Конечно, они же говорят практически на Британском. В случае с высоким уровнем языка, и подавно с RAD системами, мы практически не можем контролировать работу процессора, в лучшем случае мы как-то можем повлиять на результат работы программы. Весь процесс перевода языков берёт на себя транслятор. Здесь можно упомянуть такое понятие, как оптимизация. Оптимизация это способ организации алгоритма, т.е. каким именно образом данный алгоритм (или задача, поставленная перед программистом) будет преобразована в машинный код. В случае с Asm'ом, всей оптимизацией занимается сам разработчик. В языках высокоуровневых, оптимизацию берёт на себя транслятор, и разработчик не знает, как будет оптимизирована его программа. Но нужно указать, что трансляторы пишут так же люди весьма умные и оптимизируют они очень и очень хорошо. Разработчику придётся немало потрудиться, дабы добиться такого уровня оптимизации вручную. 

На Asm'е можно писать как под платформу х86 (x86-based PC, те которые мы привыкли видеть, построенные на процессорах архитектуры x86, к этой платформе относятся компьютеры, начиная с IBM PC и заканчивая Pentium IV, а так же все, так называемые клоны), так и под любую технику с цифровым микроконтроллером, так как этот язык представляет собой некий стандарт. Стандарт языка, по которому принято строить языки интерпретации команд процессора. А процессор, как известно, есть и у микроволновой печки, и у стиральной машины, и у всеми любимых телефонов. То есть на Asm'е можно программировать всё, что поддаётся программированию. Но это конечно, если фирма-изготовитель позаботилась о реализации Asm'а под свою микросхему. В противном же случае нам придётся всё-таки иметь дело с машинным кодом, да ещё и со своеобразным. Изучить даже самый распространённый язык процессора, язык процессора x86, будет задачей весьма непростой. Да и не поможет это, так как при переходе на другой контроллер придётся всё переучивать, потому что у каждой микросхемы свой язык, своя система команд. То есть нам помимо Британского придётся изучить и Латиницу. А в следующий раз и Французский и так далее. Поэтому мы выбираем Asm в качестве базового языка. Тем более что Asm, будучи во много раз более удобным, чем язык машинного кода, не снижает быстродействия и не ограничивает разработчика от каких либо возможностей, предоставляемых ему микроконтроллером. Таков стандарт. 

Поскольку Asm полностью отражает структуру программируемого устройства, его реализации под различные платформы так же будут варьироваться, но сам принцип останется прежним. В связи с этим разработчику всё-таки придётся изучать и саму аппаратную часть, которая различается от процессора к процессору. То есть без наречий всё-таки не обойдётся. Здесь, во вводной статье, я не буду расписывать, как и в чём конкретно изменяется Asm внешне, в зависимости от платформы, но разработчики, знающие хотя бы архитектуру x86 уже могут представить, чем он может отличаться. Смею предположить, что их догадки будут верны. И так изучение Asm'а, как указано выше, начинается с изучения платформы под которую разработчик собирается писать и всегда связано с изучением операционной системы и её API. API — Application Programming Interface, интерфейс программирования приложений. Это некая спецификация, с которой так же придётся считаться. Всё это сразу резко отдаляет момент написания первой, пусть даже самой простейшей программы, на неопределённый срок, что очень часто отпугивает начинающих программистов, решивших перейти на Asm. 

Но мы будем работать преимущественно с платформой x86, об этом и будет дальнейшая беседа. Работу на других платформах, перенос с одной на другую, мы оставим специально обученным людям, называющим себя «Ембеддерами». Ембеддер, от слова Embedded — вложенный, встроенный. В нашем случае мы рассматриваем это слово как встроенный. Ембеддер — это человек, который занимается встраиваемыми микропроцессорными системами различного назначения, а конкретно их аппаратно-программной частью. Эти люди знают и радиотехнику, и микропроцессорную технику, и программирование. Ембеддеры знают платы на микросхемах, схемы с программируемыми контроллерами и программируют эти устройства под определённые цели. 

Что касается нас, мы можем изучать Asm не только для того чтобы писать на нём в чистом виде. Практически во всех языках высокого уровня и студиях осуществлена возможность вставки кусков кода Asmа в высокоуровневую программу. Это делается для достижения максимальной скорости выполнения отдельных участков кода, например в случаях, требующих особой скорости выполнения математических операций или прямого доступа к каким либо аппаратным ресурсам. Плюс само знание Asm'а, даже может без его использования, является неотъемлемой частью знаний настоящего специалиста в программировании и разработчика. Это нужно просто для понимания того, с чем мы работаем. 

Оригинал — 23.04.2005, здесь в редакции от 20.10.2022.

При редакции, некоторые технические и стилистические моменты были оставлены неизменными.

P.S.
Ещё пол года — и эта статья будет совершеннолетней!