
Константин
01.08.2016
08:50:28
Я делал поиск по файлам, тупанул))

alter
01.08.2016
08:51:25
Ну запрятан он хорошо, это точно)

Константин
01.08.2016
09:45:52
Именование переменных: {cacc, wacc, dacc, kacc}
убило просто))

Google

Aldar
01.08.2016
09:46:21
аккумуляторы какие то чтоли?

Константин
01.08.2016
09:47:38
Да, я смотрю как устроена работа функций downcase
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/unicode/unicode.ex
Получается так.. у них есть файл с всеми unicode символами
список символов в порядке codepoint, lower, title, upper
для downcase они просто берут codepoint и возвращают lower
Я хочу написать функцию swapcase
но, похоже, это темная тема)))

Aldar
01.08.2016
09:52:18
насколько я понял в эликсире самые крутые функции upcase и downcase
хорошо работают с юникодом

Константин
01.08.2016
09:53:17
Но я самое интересное не рассказал.. для каждого кода создается функция
это не перебор, а функция для каждого символа
for {codepoint, _upper, lower, _title} <- codes, lower && lower != codepoint do
defp downcase(unquote(codepoint) <> rest, acc) do
downcase(rest, acc <> unquote(lower))
end
end

Google

alter
01.08.2016
09:57:26
Ну вот так в джаве:
package com.technologyconversations.java8exercises.streams;
import java.util.ArrayList;
import java.util.List;
import static java.util.stream.Collectors.toList;
public class ToUpperCase {
public static List<String> transform7(List<String> collection) {
List<String> coll = new ArrayList<>();
for (String element : collection) {
coll.add(element.toUpperCase());
}
return coll;
}
public static List<String> transform(List<String> collection) {
return collection.stream() // Convert collection to Stream
.map(String::toUpperCase) // Convert each element to upper case
.collect(toList()); // Collect results to a new list
}
}

Aldar
01.08.2016
09:59:08
второй метод это ж функциональщина
а первый типичная императивщина

Константин
01.08.2016
09:59:47
А реализация самого String::toUpperCase интересна
откуда он берет коды символов

alter
01.08.2016
10:00:18
Ищу, но сюрприз там навряд ли будет.

Aldar
01.08.2016
10:00:38
поидее таблица согласно стандарту

Константин
01.08.2016
10:00:51
Зацените как в эликсире
def downcase(string), do: downcase(string, "")

Aldar
01.08.2016
10:00:56
должна быть, в виде хеш таблицы

Константин
01.08.2016
10:01:04
а дальше овердохрена функций
for {codepoint, _upper, lower, _title} <- codes, lower && lower != codepoint

Aldar
01.08.2016
10:01:22

Константин
01.08.2016
10:01:25
т.е. только для верхнего регистра
Для всех остальных символов срабатывает вот это
defp downcase(«char, rest::binary», acc) do
downcase(rest, «acc::binary, char»)
end
Я же правильно понимаю?

Aldar
01.08.2016
10:02:22
ну да

Константин
01.08.2016
10:02:23
И в конце defp downcase("", acc), do: acc

Aldar
01.08.2016
10:02:58
классическая рекурсия и условие останова рекурсии

Google

Константин
01.08.2016
10:03:20
Т.е. если я хочу сделать функцию swapcase - она должна наплодить столько функций, сколько плодят upcase и downcase?))))
Надо как-то использовать уже готовые функции
Парни..
это же логично написать swapcase
и использовать его в downcase и upcase
не?
Т.е. наплодить туеву хучу функций swap а для downcase и upcase уже не плодить
Да, сейчас попробую написать PR

Dmitry
01.08.2016
10:09:21
Может сама функция swapcase будет состоять из условия и применения upcase и downcase? А по другому не сделать?

Константин
01.08.2016
10:09:46
Вы извините, что отвлекаю, мне надо кому-то это говорить и чтоб меня останавливали, если я туплю


alter
01.08.2016
10:11:31
Нашел http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/CharacterData.java?av=f
там все в классе CharacterData для каждого языка своя реализация типа:
int More ...toUpperCase(int ch) {
162 int mapChar = ch;
163 int val = getProperties(ch);
164
165 if ((val & 0x00010000) != 0) {
166 if ((val & 0x07FC0000) == 0x07FC0000) {
167 switch(ch) {
168 // map chars with overflow offsets
169 case 0x00B5 : mapChar = 0x039C; break;
170 case 0x017F : mapChar = 0x0053; break;
171 case 0x1FBE : mapChar = 0x0399; break;
172 // map char that have both a 1:1 and 1:M map
173 case 0x1F80 : mapChar = 0x1F88; break;
174 case 0x1F81 : mapChar = 0x1F89; break;
175 case 0x1F82 : mapChar = 0x1F8A; break;
176 case 0x1F83 : mapChar = 0x1F8B; break;
177 case 0x1F84 : mapChar = 0x1F8C; break;
178 case 0x1F85 : mapChar = 0x1F8D; break;
179 case 0x1F86 : mapChar = 0x1F8E; break;
180 case 0x1F87 : mapChar = 0x1F8F; break;
181 case 0x1F90 : mapChar = 0x1F98; break;
182 case 0x1F91 : mapChar = 0x1F99; break;
183 case 0x1F92 : mapChar = 0x1F9A; break;
184 case 0x1F93 : mapChar = 0x1F9B; break;
185 case 0x1F94 : mapChar = 0x1F9C; break;
186 case 0x1F95 : mapChar = 0x1F9D; break;
187 case 0x1F96 : mapChar = 0x1F9E; break;
188 case 0x1F97 : mapChar = 0x1F9F; break;
189 case 0x1FA0 : mapChar = 0x1FA8; break;
190 case 0x1FA1 : mapChar = 0x1FA9; break;
191 case 0x1FA2 : mapChar = 0x1FAA; break;
192 case 0x1FA3 : mapChar = 0x1FAB; break;
193 case 0x1FA4 : mapChar = 0x1FAC; break;
194 case 0x1FA5 : mapChar = 0x1FAD; break;
195 case 0x1FA6 : mapChar = 0x1FAE; break;
196 case 0x1FA7 : mapChar = 0x1FAF; break;
197 case 0x1FB3 : mapChar = 0x1FBC; break;
198 case 0x1FC3 : mapChar = 0x1FCC; break;
199 case 0x1FF3 : mapChar = 0x1FFC; break;
200 // ch must have a 1:M case mapping, but we
201 // can't handle it here. Return ch.
202 // since mapChar is already set, no need
203 // to redo it here.
204 //default : mapChar = ch;
205 }
206 }
207 else {
208 int offset = val << 5 >> (5+18);
209 mapChar = ch - offset;
210 }
211 }
212 return mapChar;
213 }
Ну и обертка типа:
public static int toUpperCase(int codePoint) {
return CharacterData.of(codePoint).toUpperCase(codePoint);
}


Константин
01.08.2016
11:03:44
http://joxi.ru/Q2Kjo8Rs9Pj1Dm
Работает))))
Написал swapcase))

Aldar
01.08.2016
11:06:38
Зануда mode on, лучше toggleCase

Константин
01.08.2016
11:08:49
в руби swapcase))

alter
01.08.2016
11:14:00
А можно :timer.tc забавы ради, а то спорили тут про оптимизацию кучу времени, хоть что-то потестируем ?

Константин
01.08.2016
11:16:49
Я тут просто задачу нашел поменять местами регистры букв и решил не средствами языка пилить, а вообще попробовать реализовать её в самом языке.
Действительно очень хорошо саппортится.. если учесть какой я нуб в программировании, а особенно в эликсире.

Google

alter
01.08.2016
11:18:36
Можно пояснение в каком смысле написано слово "саппортится"?

Константин
01.08.2016
11:20:07
Я к тому, что легко что-то реализовывать и исправлять.
Причем на самом эликсире

alter
01.08.2016
11:21:59
Метопрограммирование, против него....

Dmitry
01.08.2016
11:22:40
Чтобы только не погубило это elixir вдогонку за руби

Can
01.08.2016
11:23:09

Dmitry
01.08.2016
11:23:45
А оо в ActiveSupport уже есть методы "второйНаследник" и "третийНаследник" о_О

alter
01.08.2016
11:24:28

Can
01.08.2016
11:25:54
Кдастеринг только через локальную сеть или через vpn
Наружу нельзя открывать

alter
01.08.2016
11:26:40

Can
01.08.2016
11:27:13
Смотрел выступление какого то чувака
Он говорил что это недозащита
Брутятся да и не шифрование это в любом случае

alter
01.08.2016
11:28:06
Звучит логично

Can
01.08.2016
11:28:15
Поэтому самый четкий вариант кластеринга не через локалку это vpn
А через локалку там понятно

alter
01.08.2016
11:29:58
Ну а брутятся, если не доверять стандартному генератору, можно надежно сгенерить, да и попытки наверное можно выставить.
И уж в реальной жизни для немиллионного проекта такого взлома бояться наверное не стоит.

Dmitry
01.08.2016
11:30:33
Походу впн сделать ещё проще

Vladimir
01.08.2016
11:31:02
Есть ещё вариант переписать транспорт epmd на TLS какой-нибудь. Но это для совсем уже настоящих сварщиков. :)

Google

alter
01.08.2016
11:31:10
Ребята конечно всегда молодцы, что все теоретически возможные уязвимости описывают, но иногда это реально высосано из пальца.
И опять же кластер в 99% крутится в локалке.

Can
01.08.2016
11:50:43
Ну да

Taras ?
01.08.2016
14:39:08
App.Repo.update_all("users", set: [type: 1])
так я могу обновить все строки из миграции,
как обновить одну строку (к примеру where id=1) ?
подскажите пожалуйста
App.Repo.update(Ecto.Changeset, "users", set: [type: 2], where: [id: 1])
так - ругается
from(p in Users, where: p.id = 1, update: [set: [type: 2]])
|> App.Repo.update_all([])
и так тоже ругается, хоть и нагуглил это как пример

Vladimir
01.08.2016
14:49:25
А у тебя структура-то есть пользователя???
Ну связанная с таблицей.

Taras ?
01.08.2016
14:49:32
query = Ecto.Changeset.put_change(Ecto.Changeset, "users", set: [type: 2], where: [id: 1])
App.Repo.update(query)
и так ругается
прошу прощения, новичек
что такое структура?
таблица есть, записи есть
это в миграции пишу в change,
import прописал для Ecto.Changeset и Ecto.Query

Vladimir
01.08.2016
14:54:04
Schema
https://hexdocs.pm/ecto/Ecto.Schema.html

Dmitry ?
01.08.2016
14:55:23
Как ругается, что пишет?

Taras ?
01.08.2016
14:57:05
да, schema "users" есть в модели User