@proelixir

Страница 47 из 1045
Константин
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
def downcase(string), do: downcase(string, "")
это похоже на каррирование

Константин
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
http://erlang.org/doc/man/epmd.html порт получается 4369
Это epmd, он нужен для кластеринга, его ни в коем случае нельзя оставлять открытым Т.к. Можно будет подрубить машину в кластер и она будет иметь доступ ко всему и защиты считай нет

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

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

Страница 47 из 1045