Показаны сообщения с ярлыком репост. Показать все сообщения
Показаны сообщения с ярлыком репост. Показать все сообщения

Как работает программист

Если вы хотите представить что именно делает программист во время работы, то легче всего это представить именно так. Он спит!

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

Это вы думаете что программист взял задачу, написал программу и задача решилась. Всё не так.

Если взять к примеру задачу нахождения пути выхода из лабиринта. Программист в решении этой задачи не перст который ведёт воображаемую маленькую заблудившуюся девочку незнакомой тропой к выходу. Он и не эта девочка тоже. И не стены лабиринта. Он не выход который надо найти. Он всё это вместе разом.

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

Я не фигурально выражаюсь. Это БУКВАЛЬНО снится. Программист при решении задачи виртуально живёт в создаваемом мире химер, похожих каким-то образом на условия решаемой задачи.

Внешне наблюдение за работающим программистом это тоже самое что наблюдение за спящим человеком.


источник

Почему хэш-функции являются односторонними?

Let me invent a simple "password hashing algorithm" to show you how it works. Unlike the other examples in this thread, this one is actually viable, if you can live with a few bizarre password restrictions. Your password is two large prime numbers, x and y. For example:
x = 48112959837082048697
y = 54673257461630679457
You can easily write a computer program to calculate xy in O(N^2) time, where N is the number of digits in x and y. (Basically that means that it takes four times as long if the numbers are twice as long. There are faster algorithms, but that's irrelevant.) Store xy in the password database.
x*y = 2630492240413883318777134293253671517529
A child in fifth grade, given enough scratch paper, could figure out that answer. But how do you reverse it? There are many algorithms people have devised for factoring large numbers, but even the best algorithms are slow compared to how quickly you can multiply x by y. And none of those algorithms could be performed by a fifth grader, unless the numbers were very small (e.g., x=3, y=5).
That is the key property: the computation is much simpler going forwards than backwards. For many problems, you must invent a completely new algorithm to reverse a computation.
This has nothing to do with injective or bijective functions. When you are cracking a password, it often doesn't matter if you get the same password or if you get a different password with the same hash. The hash function is designed so it is hard to reverse it and get any answer at all, even a different password with the same hash. In crypto-speak: a hash function vulnerable to a preimage attack is utterly worthless. (The password hashing algorithm above is injective if you have a rule that x < y.)
What do cryptography experts do? Sometimes, they try to figure out new algorithms to reverse a hash function (pre-image). They do exactly what you say: analyze the algorithm and try to reverse it. Some algorithms have been reversed before, others have not.
Exercise for the reader: Suppose the password database contains the following entry:
3521851118865011044136429217528930691441965435121409905222808922963363310303627
What is the password? (This one is actually not too difficult for a computer.)
Footnote: Due to the small number of passwords that people choose in practice, a good password hash is not merely difficult to compute backwards but also time-consuming to compute forwards, to slow down dictionary attacks. As another layer of protection, randomized salt prevents the use of precomputed attack tables (such as "rainbow tables").
Footnote 2: How do we know that it is hard to reverse a hash function? Unfortunately, we don't. We just don't know any easy ways to reverse hash functions. Making a hash function that is provably difficult to reverse is the holy grail of hash function design, and it has not been achieved yet (perhaps it will never happen).

источник

Гарвардский курс CS50 на русском. Все серии

Друзья, мы рады сообщить, что перевод всего гарвардского курса CS50 закончен. В курсе было 24 серии, но последние две были одной и той же лекцией - одна прочитана в Гарварде, а другая в Йеле.
Курс переведён и озвучен нашей студией по заказу JavaRush, и мы хотим сказать им огромное спасибо за поддержку!

Простота против лёгкости

Вот как работает Rails, классический пример:

User.create(params[:user])

Вы видите простую строку кода, и вы можете сразу сказать(если вы знаете, является ли User моделью ActiveRecord), что она делает. Проблема здесь заключается в том, что люди путают простоту с удобством. Эту строку удобно/легко написать в вашем контролере и всё сразу заработает, не так ли?

Однако, эта строка кода не является простой, её легко написать, но код "под капотом" чрезвычайно сложен, так как:

  • params должны пройти через СУБД-специфические приведения типов
  • params должны быть валидированы
  • params могут быть изменены с помощью колбеков, включая потенциальные вызовы внешних систем, вызывающие побочные эффекты
  • невалидное состояние приводит к установке сообщений об ошибках, которые зависят от внешних систем (например I18n)
  • валидные params должны повлиять на состояние объекта, и возможно изменить состояние ассоциированных с ним объектов
  • один объект или весь граф объекта должен быть сохранен в базе данных

Новая технология позволит сохранить всю информацию человечества в одной комнате при помощи ДНК

В новом исследовании описана новая методика кодирования для хранения данных в ДНК.
Фото New York Genome Center.

Проблема хранения больших объёмов данных всё больше усугубляется. Только за последние два года было создано столько информации, сколько не было произведено человечеством за все предыдущие века. Согласно статистике, люди сегодня создают два с половиной экзабайта данных ежедневно – это 2500 миллиардов гигабайтов. Так что в скором времени поток информации может просто "задушить" все возможности хранения жёстких дисков. Так, в науке немало проблем такого рода порождает быстроразвивающаяся отрасль генетики.

Как декомпилировать Android приложение?

You need Three Tools to decompile an APK file.
  1. Dex2jar - Tools to work with android .dex and java .class files
  2. ApkTool - A tool for reverse engineering Android apk files
  3. JD-GUI - Java Decompiler is a tools to decompile and analyze Java 5 “byte code” and the later versions.
for more how-to-use-dextojar. Hope this will help You and all! :)


источник

Организация модулей в Python

How do I organize my modules (source files)? (Archive)

The first line of each file shoud be #!/usr/bin/env python. This makes it possible to run the file as a script invoking the interpreter implicitly, e.g. in a CGI context.
Next should be the docstring with a description. If the description is long, the first line should be a short summary that makes sense on its own, separated from the rest by a newline.
All code, including import statements, should follow the docstring. Otherwise, the docstring will not be recognized by the interpreter, and you will not have access to it in interactive sessions (i.e. through obj.__doc__) or when generating documentation with automated tools.
Import built-in modules first, followed by third-party modules, followed by any changes to the path and your own modules. Especially, additions to the path and names of your modules are likely to change rapidly: keeping them in one place makes them easier to find.
Next should be authorship information. This information should follow this format:
__author__ = "Rob Knight, Gavin Huttley, and Peter Maxwell"
__copyright__ = "Copyright 2007, The Cogent Project"
__credits__ = ["Rob Knight", "Peter Maxwell", "Gavin Huttley",
                    "Matthew Wakefield"]
__license__ = "GPL"
__version__ = "1.0.1"
__maintainer__ = "Rob Knight"
__email__ = "rob@spot.colorado.edu"
__status__ = "Production"
Status should typically be one of "Prototype", "Development", or "Production". __maintainer__should be the person who will fix bugs and make improvements if imported. __credits__differs from __author__ in that __credits__ includes people who reported bug fixes, made suggestions, etc. but did not actually write the code.


источник

Микроразметка сайта schema.org: самый простой способ



Многим начинающим вебмастерам не совсем понятно, как использовать микроразметку Schema.org на своём сайте. Сегодня уже не нужно заказывать эту услугу у фрилансеров.
Этот процесс сейчас практически автоматизированный благодаря мастеру разметки структурированных данных от Google, этот инструмент работает как конструктор, вам достаточно выделять необходимую область элемента страницы и указывать к какому тегу микроразметки Schema.org будет относится выделенный вами элемент. После проведённой «операции» получаем готовый HTML код с разметкой Schema.org.

Эксперты: От хакеров скоро придется защищать даже мозг

Электроника, вживляемая в головной мозг, уже очень скоро может стать обыденным явлением, сообщает "Вести.Ru".

Имплантаты, предсказывают футурологи, обеспечат центральный орган нервной системы дополнительным "мощностями" и помогут существенно расширить мыслительные способности человека. Кроме того, посылая импульсы напрямую в ЦНС, можно будет лечить самые разные заболевания.

Биоэлектроникой, в частности, недавно заинтересовалась Google: 1 августа она учредила новую компанию, которая ставит перед собой цель разработать миниатюрные электрические имплантаты к 2023 году. Органическая электроника позволит лечить хронические болезни, такие как артрит, диабет и астма, путем стимулирования определенных частей тела.

Будьте добры к программистам

— Тебе так повезло, что ты программист. Хотел бы я быть программистом.
— А почему ты не научишься?
— Я пытался, заходил на codeacademy и другие сайты, но это не моё.
— Да, программирование, действительно, не для всех.
— Тебе хорошо платят и ты можешь создавать разные вещи. Почти каждый день к тебе поступают сумасшедшие предложения минимум на 100 тысяч долларов.
— Да, это очень лестно. Немножко сносит крышу, если честно.
— Ты получаешь свою долю в компании, все уважают инженеров. Ты можешь воплотить любую идею в приложение и стать богатым. И тебе не нужно для этого никого нанимать.
— Вообще-то программирование делает меня несчастным.
— Ого. В смысле?
— Чтобы быть хорошим программистом, мне нужно выработать особый склад ума. Он и делает меня грустным. Я это замечаю и в других программистах — не во всех — но во многих.
— Что это за склад ума?
— Концентрация на недостатках, а не достоинствах.
— Почему, чтобы стать хорошим кодером, тебе это нужно?
— Я работаю примерно так:
1. Пишу код
2. Запускаю его
3. Получаю сообщение об ошибке
4. Нахожу ошибку и возвращаюсь к шагу 1.
Этим я занимаюсь час за часом, день за днём. В постоянном поиске, что неправильно в том, что я сделал, редко задумываясь о том, что в этом хорошего. Это система с отрицательной обратной связью.
— С ума сойти.
— Когда я не в Vim'е, я в баг-трекере — списке недостатков. Список того, что сломано и требует исправления. Список того, где я напортачил.
— Мне кажется, ты слишком драматизируешь. Кроме того, разве исправление ошибок и вычёркивание их из этого списка, не приносит удовольствие?
— Приносит, конечно. В программировании много невероятно приятного и вдохновляющего. Но это не отменяет для меня того факта, что со временем программирование создаёт очень негативно настроенный склад ума. Я всегда спрашиваю «что тут неправильно?». Позитивно настроенные люди всегда ищут «что в этом хорошего?» 

Что такое монады: заблуждение из мира Haskell

В Haskell-сообществе существует проблема с монадами. Впрочем, нет, не совсем так. Позвольте я перефразирую: у Haskell-новичков существует проблема с монадами, и Haskell-сообщество частично виновно в этом.

Теоретический минимум для программиста


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

Построенные на теории массового обслуживания и стандарте GSM сети мобильной связи; PHP-скрипты, исполняющиеся на удаленных серверах и передающие свою выдачу через Ethernet по TCP/IP на компьютеры с NDIS-драйверами; процессоры, переупорядочивающие и спекулятивно исполняющие наборы инструкций для того, чтобы скомпенсировать вызванную ограничениями полупроводниковой электроники и скоростью света остановку роста тактовой частоты; рассчитанные на ЭВМ корпуса самолетов и автомобилей, лекарства и структуры ДНК; компьютерные игры, ради крохотного блика в которых пишутся мегабайты заполненных интегралами Френеля статей; электронные фильмы и книги; алгоритмы NLP и TreeNet, вызывающие нам из огромных баз данных поисковую выдачу — вот то, что окружает нас каждый день благодаря программистам, благодаря оригинальным подходам и фундаментальным знаниям, благодаря продуманной и отточенной десятилетиями методологии разработки и управления сложностью ПО.

Я и мои единомышленники взяли на себя труд составить теоретический минимум для программиста на основании наиболее ярких отраслей IT, вошедших даже в программы нормальных университетов, на основании собеседований и постоянно пригождающихся на практике знаний. Часть из пунктов этого минимума можно изучить за 5 минут по википедии, часть же потребует серьезного труда на протяжении нескольких месяцев, но это именно то, что обязательно следует знать и чем следует свободно владеть. В комментариях приветствуются исправления и дополнения.


Хорошие книги по C++

Когда я планировала подборку книг по C++, я решила исправить ошибку, совершенную с книгами по организации кода: там получилась огромная простыня, которую неудобно читать. Для начала я решила выкинуть книги по STL, о них я напишу как-нибудь в другой раз. Но даже книг по C++ без STL оказалось столько, что пришлось разбить их на несколько групп. Итак, в ближайшие дни

  • Для начинающих. Сюда вошли книги, с которых хорошо начинать изучение языка С++. Хорошо подойдут и тем, кто не хочет что-либо разрабатывать на С++, а хочет ознакомиться с языком "для общего развития".
  • Для продолжающих. Книги для тех, кто активно занимается разработкой программ на С++ и собирается заниматься этими разработками и дальше.
  • Для фанатов. Для тех, кто очень любит язык С++. Также должно быть интересно разработчикам компиляторов.
  • Остальные. Книги, которые стоят у меня в списке "надо прочесть", ничего подробного я о них сказать не могу, кроме того, что знающие люди говорят, что они хорошие.

Ссылки по теме:
Хорошие книги по организации кода

Недавно Скотт Мейерс опубликовал несколько подборок на тему языка С++, которые я очень рекомендую почитать.
The Most Important C++ Books...Ever
The Most Important C++ Non-Book Publications...Ever
The Most Important C++ Software...Ever
The Most Important C++ People...Ever
My Most Important C++ Aha! Moments...Ever

источник

The Definitive C++ Book Guide and List

Beginner

Introductory, no previous programming experience

  • Programming: Principles and Practice Using C++ (Bjarne Stroustrup) (updated for C++11/C++14) An introduction to programming using C++ by the creator of the language. A good read, that assumes no previous programming experience, but is not only for beginners.

Introductory, with previous programming experience

  • C++ Primer * (Stanley Lippman, Josée Lajoie, and Barbara E. Moo) (updated for C++11) Coming at 1k pages, this is a very thorough introduction into C++ that covers just about everything in the language in a very accessible format and in great detail. The fifth edition (released August 16, 2012) covers C++11. [Review]
  • A Tour of C++ (Bjarne Stroustrup) The "tour" is a quick (about 180 pages and 14 chapters) tutorial overview of all of standard C++ (language and standard library, and using C++11) at a moderately high level for people who already know C++ or at least are experienced programmers. This book is an extended version of the material that constitutes Chapters 2-5 of The C++ Programming Language, 4th edition.
  • Accelerated C++ (Andrew Koenig and Barbara Moo) This basically covers the same ground as the C++ Primer, but does so on a fourth of its space. This is largely because it does not attempt to be an introduction to programming, but an introduction to C++ for people who've previously programmed in some other language. It has a steeper learning curve, but, for those who can cope with this, it is a very compact introduction into the language. (Historically, it broke new ground by being the first beginner's book to use a modern approach at teaching the language.) [Review]
  • Thinking in C++ (Bruce Eckel) Two volumes; is a tutorial style free set of intro level books. Downloads: vol 1vol 2. Unfortunately they’re marred by a number of trivial errors (e.g. maintaining that temporaries are automatically const), with no official errata list. A partial 3rdparty errata list is available at (http://www.computersciencelab.com/Eckel.htm), but it’s apparently not maintained.
* Not to be confused with C++ Primer Plus (Stephen Prata), with a significantly less favorable review.

Comparing to NSNull

Checks to NSNull come up a lot when dealing with things like parsing JSON and while it’s mostly just ==, there are some options.
The officially sanctioned method is NSNull sample code, but this will generate a warning in clang (BOOO HISSSS).

Варианты многопоточности в iOS

Каждое iOS приложение состоит из одного или более потока. Каждое приложение начинается с одного потока и, затем может создавать еще дополнительные потоки.
Когда приложение создает дополнительный поток, он становится отдельной сущностью в пространстве процесса приложения. Каждый поток имеет свой стек и планируется на исполнение отдельно kernel’ом. Поток может общаться с другими потоками. Все потоки находятся в общем адресном пространстве приложения и делят одну и ту же виртуальную память и имеют те же права доступа что и процесс приложения.
Главный поток приложения имеет существенные отличия от остальных  по своему фнукционалу. Он выполняет функцию main приложения и отвечает за обработку событий от пользователя и обновление UI.
Поэтому, если, скажем нам нужно сделать чтото асинхронное или объемное, то желательно это сделать не в основном потоке. Если это делать на главном потоке – приложение перестанет реагировать на пользователя и с большой долей вероятности будет закрыто.

Многопоточность в iOS. Введение в GCD, часть 4, семафоры

Очередная статья о GCD. На этот раз познакомимся с семафорами, механизм которых предлагает нам GCD. Семафор позволяет выполнять какой-либо участок кода одновременно только конкретному количеству потоков. В основе семафора лежит счетчик, который и определяет, можно ли выполнять участок кода текущему потоку или нет. Если счетчик больше нуля — поток выполняет код, в противном случае — нет.
На семафоре определены три операции:
  • Создание семафора
  • Подождать, пока счетчик семафора станет больше нуля, уменьшить его на единицу и пройти далее
  • Увеличить счетчик на единицу

Многопоточность в iOS. Введение в GCD, часть 3

В первой части мы узнали, что для выполнения задач существуют очереди. Узнали какие виды очередей существуют и как из создавать. В третьей части мы познакомимся с полезными функциями для управления очередями задач.
Вспомним, что очередь создается вот так:
dispatch_queue_t queue = dispatch_queue_create("com.myapp.myqueue", DISPATCH_QUEUE_CONCURRENT);
Далее мы будем использовать переменную queue, подразумевая что очередь у нас создана.