
Stanislav
22.10.2016
02:25:45
бля тут живые есть

Nick
22.10.2016
02:25:49
Да я давно тут.
Не активничаю просто
Привет, да

Google

Anton
22.10.2016
02:26:28
Ты не в Москве часом?

Nick
22.10.2016
02:26:52
Не. В пердях своих сижу.

Anton
22.10.2016
02:27:15
Эх, я уж надеялся затусить сегодня, лол

Stanislav
22.10.2016
02:28:38

Nick
22.10.2016
02:29:04
В моём случае — Нижний Новгород

Stanislav
22.10.2016
02:29:30

Nikolay
22.10.2016
03:10:31

Anton
22.10.2016
03:12:59
А хз

Константин
22.10.2016
04:35:07
Материться можно только Вове, он это делает в тему.
Оп в бане.
Остальным можно материться, но значительно меньше Вовы ?

Maxim
22.10.2016
09:01:43

Taras ?
22.10.2016
10:49:02
что значит ошибка феникса
[error] backend port not found: :inotifywait
и что делать?

Google

Dmitry ?
22.10.2016
11:03:16
https://github.com/phoenixframework/phoenix/issues/776

Taras ?
22.10.2016
12:16:20
вопрос насчет составного индекса - правильно ли я понимаю, что :
create unique_index(:users, [:nickname, :email])
будет следить только за уникальной комбинацией логина и емейла, и будет пропускать отдельно логины и емейлы (возможен отдельный дубляж логинов и емейлов, невозможен дубляж только комбинации логин+емейл)
в отличии от
create unique_index(:users, [:email])
create unique_index(:users, [:nickname])
?

pny
22.10.2016
12:20:07
Да

Taras ?
22.10.2016
13:15:52
iex(10)> re = ~r/^([a-zA-Z0-9-_*])+$/
~r/^([a-zA-Z0-9-_*])+$/
iex(11)> "88*" =~ re
true
iex(12)> "88\*" =~ re
true
iex(13)> "88/*" =~ re
false
почему так?
как сделать чтобы на \ тоже было false ?

Serhij
22.10.2016
13:30:38
\ же для отражения строк предназначен

Taras ?
22.10.2016
13:32:08
и как же правильно приготовить регулярку логина?
в чем разница между
re = ~r/^([\w-\*])+$/i
и
re = ~R/^([\w-\*])+$/i
?
так же пропускает \

Serhij
22.10.2016
13:38:58
\ в консоли внутри строки служит для экранирования
Если ты хочешь чтобы строка содержала обратный слеш, то нужно вот так: "hello\\"

Taras ?
22.10.2016
13:39:56
тоесть регулярка норм работает?
благодарямс)
правильно ли я помню —-
если у меня есть таблицы -
пользователи, посты, комменты —
и в schema "users"
я напишу
has_many :posts, Blog.Post, on_delete: :delete_all
has_many :comments, Blog.Comment, on_delete: :delete_all
при удалении пользователя - удалятся все его посты и все его комменты ?
(в миграции references и belongs_to в схемах постов и комментов - в наличии)

defiat
22.10.2016
19:46:39
CP2020.pdf

Taras ?
22.10.2016
22:04:59
в каких случаях появляется ошибка
== Compilation error on file web/views/post_view.ex ==
** (TokenMissingError) web/templates/post/comments.html.eex:13: missing terminator: end (for "do" starting at line 12)
(eex) lib/eex/compiler.ex:34: EEx.Compiler.generate_buffer/4
(phoenix) lib/phoenix/template.ex:378: Phoenix.Template.compile/2
(phoenix) lib/phoenix/template.ex:186: Phoenix.Template."-MACRO-__before_compile__/2-fun-0-"/3
(elixir) lib/enum.ex:1623: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix) expanding macro: Phoenix.Template.__before_compile__/1
web/views/post_view.ex:1: Blog.PostView (module)
(elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
если с end-ами все хорошо?

Dmitry
22.10.2016
22:05:46
В шаблоне точно все хорошо с эндами?

Taras ?
22.10.2016
22:06:10
точно, два часа уже сижу

Dmitry
22.10.2016
22:06:37
Стопудово косяк где то

Taras ?
22.10.2016
22:06:50
переписал - вынес весь html с for внутрь <%= ... %>
в {:safe, "..."} —- тогда скомпилилось

Dmitry
22.10.2016
22:07:25
Может в каком нибудь ИФе равно пропустил
Или процент где нибудь забыл
Это ж шаблоны

Google


Taras ?
23.10.2016
00:14:10
я так и не понял почему там ошибка появилась и почему пропала)
теперь новая фигня —
пытаюсь сделать поиск "lower(...)"
query = from u in "users",
where: fragment("LOWER(?)", u.nickname) == type(^nickname, u.nickname),
select: fragment("*")
query |> first([]) |> repo.one
вроде все как пишет в https://hexdocs.pm/ecto/Ecto.Query.API.html#fragment/1
но получаю
== Compilation error on file web/models/session.ex ==
** (CompileError) web/models/session.ex:20: cannot use ^nickname outside of match clauses
(stdlib) lists.erl:1354: :lists.mapfoldl/3
(stdlib) lists.erl:1354: :lists.mapfoldl/3
(stdlib) lists.erl:1355: :lists.mapfoldl/3
(stdlib) lists.erl:1354: :lists.mapfoldl/3
(stdlib) lists.erl:1355: :lists.mapfoldl/3
(stdlib) lists.erl:1354: :lists.mapfoldl/3
ЧЯДНТ ?? ((((((
Ecto.Adapters.SQL.query тоже падает со странной ошибкой((
iex(2)> Ecto.Adapters.SQL.query(Blog.Repo, "SELECT u0.\"id\", u0.\"nickname\", u0.\"email\", u0.\"crypted_password\", u0.\"type\", u0.\"inserted_at\", u0.\"updated_at\" FROM \"users\" AS u0 WHERE (LOWER(u0.\"nickname\") = '$1') LIMIT 1", ["some_nick"])
[debug] QUERY ERROR db=4.6ms queue=0.2ms
SELECT u0."id", u0."nickname", u0."email", u0."crypted_password", u0."type", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (LOWER(u0."nickname") = '$1') LIMIT 1 ["some_nick"]
** (ArgumentError) parameters must be of length 0 for query %Postgrex.Query{columns: ["id", "nickname", "email", "crypted_password", "type", "inserted_at", "updated_at"], copy_data: false, decoders: [#Function<....
при этом при запросе напрямую к постгресу - работает
как же все-таки в фениксе сделать запрос с LOWER поиском по базе?
вот так
query = from u in "users",
where: fragment("LOWER(u0.\"nickname\") = ?", ^nickname),
select: fragment("u0.\"id\", u0.\"nickname\", u0.\"email\", u0.\"crypted_password\", u0.\"type\", u0.\"inserted_at\", u0.\"updated_at\"")
rez = repo.all(query)
с какого-то чуда —- возвращает только значение первого столбца — тоесть только id
что поделать с этим можно?
ок, пойду на гитхаб мучать аффторов =\
ура, сам создатель hex-а подсказал))
Ecto.Adapters.SQL.query(repo, "SELECT u0.\"id\", u0.\"nickname\", u0.\"email\", u0.\"crypted_password\", u0.\"type\", u0.\"inserted_at\", u0.\"updated_at\" FROM \"users\" AS u0 WHERE (LOWER(u0.\"nickname\") = $1) LIMIT 1", [nickname])
типу так) ура)


Yusup
23.10.2016
14:54:29
я тут статейку читаю http://blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/
тут Хосе говорит о том, как можно круто моки создавать
и ближе к концу пишет, что можно создать контракт через behaviour
но я не понимаю, в чем смысл создавать контракт, если мы его нигде не заставляем соблюдать

Yusup
23.10.2016
14:56:03
или не упоминаем в @spec
вообще в эликсире можно так?
типа "вот у меня есть аттрибут @twitter_api_impl и у него должен быть бехавиор объявленный в MyApp.Twitter
типа как с интерфейсами в джаве или тайпклассами в хаскеле

Dmitry
23.10.2016
15:44:24
Интерфейс отвечает за функциональность
Так же как и behaviour
От определяет методы а не какие не атрибуты
И если ты вызовешь какой то метод у twitter_api то он упадёт если не соблюдает интерфейс

Google

Yusup
23.10.2016
15:46:53
ну да
просто если мы берем ту же джаву

Admin
ERROR: S client not available

Yusup
23.10.2016
15:47:19
у нас есть интерфейс с некоторым количеством методов
например тут
interface Mailer {
void sendMail(options: Object[]);
}
class MyApp {
public void MyApp(mailer: Mailer) {
// ...
}
}
тут MyApp требует mailer который имплементит Mailer
ключевое слово - требует
в примере хосе у нас есть @twitter_api - это атрибут модуля, который может быть либо реальным TwitterApi либо моком
потом хосе говорит "давайте добавим контрактов" и создает бехавиор который реализуется как TwitterApi так и моком
но в отличии от примера с джава кодом, этот бехевиор нигде не требуется
в чем смысл контракта если мы ни коим образом не заставляем его соблюдать
может можно как-то так?
@spec twitter_api :: TwitterApi.Behavior
@twitter_api Application.get_env(:my_app, :twitter_api)


Dmitry
23.10.2016
15:51:51
Смысл в том, что если ты в своей библиотеке напишешь @behaviour Twitter.API, а потом после обновления библиотеки Twitter этот behaviour поменяется - то у тебя не склмпилируется программа
А то что ты передал мок, который не имплементит что-то - то эрланг это язык с нестрогой типизацией
Да и вообще это ошибка на уровне - передал 2 вместо 3
Никто от такого не застрахован
Хотя не исключено что какие то спеки есть
Но я таких не знаю
В общем от duck typing никуда не уйдёшь

Google

Dmitry
23.10.2016
15:57:42
С другой стороны программа, вылетающая в рантайме от отсутствующего метода - трудно представить как такую ошибки можно сразу не отловить

Yusup
23.10.2016
16:00:11
тогда в чем смысл "контракта" хосе? контракт - это когда есть две стороны, первая говорит "мне нужен любой объект/модуль/функция которая умеет делать так-то" а вторая сторона говорит "у меня есть такая вещь". и с помощью интерфейсов мы можем с определенной точностью знать что контракт соблюдается. у хосе так - он создает behaviour но нигде не требует чтобы он соблюдался. только создает несколько модулей чтобы реализовать его.
как ты и сказал, утиная типизация и все такое. оно бы и так взлетело без всякого бехавиора

Dmitry
23.10.2016
16:00:39
Но я спрошу на форуме, посмотрим что ответят

Yusup
23.10.2016
16:03:04
ок спасибо
я прочел твой комент еще раз и понял твой посыл
но все равно не понимаю, чего добивался хосе
и этот чувак https://medium.com/@lasseebert/mocks-in-elixir-7204f8cc9d0f#.cydkoct8i
есть еще один вопрос про behaviours
можно ли сделать что-то вроде такого?
defmodule Adder do
@callback add(integer, integer) :: integer
def add2(a) do
add(a, 2)
end
def add3(a) do
add(a, 3)
end
end
defmodule Plus do
@behaviour HazelClient.Adder
def add(a, b) do
a + b
end
end
то есть тут у нас модуль с методом add, у которого отсутствует реализация и реализованные add2 и add3 которые пользуются add
у меня этот код не компилируется, говорит, что не знает функцию "add" у Adder