Что подразумевается под ошибкой Name already defined ?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

Что подразумевается под ошибкой Name already defined ?

Genosse
Я конечно понимаю дословный перевод " Name already defined ->" Но что то не пойму в чём дело...
Это то, что метод с таким именем где то используется или что то другое?

В процессе экспериментов получил ошибку (другую). стал править один метод и получил  Name already defined -> Странно, что если даже возвращаю метод к исходному состоянию при Accept(е) опять    Name already defined ... Я вроде откатил все изменения, а один чёрт

Как искать корень зла? Вроде я ничего не already defined... :(

Я понимаю что сложно наверное сказать не видя кода, но что это может быть, какие варианты, как можно искать причины?  

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Dennis Schetinin
О каком Smalltalk-е речь-то? В Pharo я такой строки не нахожу совсем… в отличие от Name already — такие слова встречаются несколько раз.

По описанию, конечно, похоже на глюк (с учетом того, что Smalltalk-и не особо надежны в плане отката изменений) , но кто знает… Метод с таким же именем, по идее, мешаться не может, так как при совпадении имен новая версия просто "перекрывает" предыдущую. Это, скорее, может относиться к имени переменной или (или в частности?) имени класса.


--

Best regards,


Dennis Schetinin



11 сентября 2013 г., 21:33 пользователь Genosse Alex <[hidden email]> написал:
Я конечно понимаю дословный перевод " Name already defined ->" Но что то не пойму в чём дело...
Это то, что метод с таким именем где то используется или что то другое?

В процессе экспериментов получил ошибку (другую). стал править один метод и получил  Name already defined -> Странно, что если даже возвращаю метод к исходному состоянию при Accept(е) опять    Name already defined ... Я вроде откатил все изменения, а один чёрт

Как искать корень зла? Вроде я ничего не already defined... :(

Я понимаю что сложно наверное сказать не видя кода, но что это может быть, какие варианты, как можно искать причины?  

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Alex Kogan
Означает что переменная с таким именем уже существуе.
Если попытаться скомпилировать вот такой метод:
testing
    | aVar |
    
    aVar := Object new.
    
    [| aVar |  aVar new] forkAt: 15

Pharo выдает ошибку:

testing
    | aVar |
   
    aVar := Object new.
   
    [|  Name is already defined ->aVar |  aVar new] forkAt: 15
   


2013/9/11 Dennis Schetinin <[hidden email]>
О каком Smalltalk-е речь-то? В Pharo я такой строки не нахожу совсем… в отличие от Name already — такие слова встречаются несколько раз.

По описанию, конечно, похоже на глюк (с учетом того, что Smalltalk-и не особо надежны в плане отката изменений) , но кто знает… Метод с таким же именем, по идее, мешаться не может, так как при совпадении имен новая версия просто "перекрывает" предыдущую. Это, скорее, может относиться к имени переменной или (или в частности?) имени класса.


--

Best regards,


Dennis Schetinin



11 сентября 2013 г., 21:33 пользователь Genosse Alex <[hidden email]> написал:

Я конечно понимаю дословный перевод " Name already defined ->" Но что то не пойму в чём дело...
Это то, что метод с таким именем где то используется или что то другое?

В процессе экспериментов получил ошибку (другую). стал править один метод и получил  Name already defined -> Странно, что если даже возвращаю метод к исходному состоянию при Accept(е) опять    Name already defined ... Я вроде откатил все изменения, а один чёрт

Как искать корень зла? Вроде я ничего не already defined... :(

Я понимаю что сложно наверное сказать не видя кода, но что это может быть, какие варианты, как можно искать причины?  

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Genosse
In reply to this post by Dennis Schetinin
В Pharo (открывал образ и в 2.0 и 3.0.),  Seaside 3
Ругается на метод из того же класса.
--
Попробую ещё весь пакет в Squeak запустить...


среда, 11 сентября 2013 г., 21:56:05 UTC+4 пользователь chaetal написал:
О каком Smalltalk-е речь-то? В Pharo я такой строки не нахожу совсем… в отличие от Name already — такие слова встречаются несколько раз.

По описанию, конечно, похоже на глюк (с учетом того, что Smalltalk-и не особо надежны в плане отката изменений) , но кто знает… Метод с таким же именем, по идее, мешаться не может, так как при совпадении имен новая версия просто "перекрывает" предыдущую. Это, скорее, может относиться к имени переменной или (или в частности?) имени класса.


--

Best regards,


Dennis Schetinin



11 сентября 2013 г., 21:33 пользователь Genosse Alex <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="SBPXQxIi3oQJ">gen...@...> написал:
Я конечно понимаю дословный перевод " Name already defined ->" Но что то не пойму в чём дело...
Это то, что метод с таким именем где то используется или что то другое?

В процессе экспериментов получил ошибку (другую). стал править один метод и получил  Name already defined -> Странно, что если даже возвращаю метод к исходному состоянию при Accept(е) опять    Name already defined ... Я вроде откатил все изменения, а один чёрт

Как искать корень зла? Вроде я ничего не already defined... :(

Я понимаю что сложно наверное сказать не видя кода, но что это может быть, какие варианты, как можно искать причины?  

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="SBPXQxIi3oQJ">sugr+uns...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Genosse
In reply to this post by Alex Kogan
А если внутри метода выдающего ошибку чего-то похожего нет? (Да и вообще первоначально он нормально прошёл) где может таиться ошибка? 

--
Вообще странно как-то получилось... сам я этот код и метод, в частности не писал, вроде из достоверного источника взял.
 Ради того, что бы проще было разобраться с примерной логикой реализации одного веб-компонента, решил по порядку до него пройти известный пример "ToDo Application" http://www.hpi.uni-potsdam.de/hirschfeld/seaside/tutorial. Но что-то не далеко ушёл.., вроде всё по порядку и без самодеятельности, однако вот.., практически на первых же паре страниц...   :(

среда, 11 сентября 2013 г., 22:12:10 UTC+4 пользователь Саша написал:
Означает что переменная с таким именем уже существуе.
Если попытаться скомпилировать вот такой метод:
testing
    | aVar |
    
    aVar := Object new.
    
    [| aVar |  aVar new] forkAt: 15

Pharo выдает ошибку:

testing
    | aVar |
   
    aVar := Object new.
   
    [|  Name is already defined ->aVar |  aVar new] forkAt: 15
   


2013/9/11 Dennis Schetinin <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="m05uUYH-Of0J">cha...@...>
О каком Smalltalk-е речь-то? В Pharo я такой строки не нахожу совсем… в отличие от Name already — такие слова встречаются несколько раз.

По описанию, конечно, похоже на глюк (с учетом того, что Smalltalk-и не особо надежны в плане отката изменений) , но кто знает… Метод с таким же именем, по идее, мешаться не может, так как при совпадении имен новая версия просто "перекрывает" предыдущую. Это, скорее, может относиться к имени переменной или (или в частности?) имени класса.


--

Best regards,


Dennis Schetinin



11 сентября 2013 г., 21:33 пользователь Genosse Alex <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="m05uUYH-Of0J">gen...@...> написал:

Я конечно понимаю дословный перевод " Name already defined ->" Но что то не пойму в чём дело...
Это то, что метод с таким именем где то используется или что то другое?

В процессе экспериментов получил ошибку (другую). стал править один метод и получил  Name already defined -> Странно, что если даже возвращаю метод к исходному состоянию при Accept(е) опять    Name already defined ... Я вроде откатил все изменения, а один чёрт

Как искать корень зла? Вроде я ничего не already defined... :(

Я понимаю что сложно наверное сказать не видя кода, но что это может быть, какие варианты, как можно искать причины?  

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="m05uUYH-Of0J">sugr+uns...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="m05uUYH-Of0J">sugr+uns...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Alex Kogan
Метод в студию.


2013/9/11 Genosse Alex <[hidden email]>
А если внутри метода выдающего ошибку чего-то похожего нет? (Да и вообще первоначально он нормально прошёл) где может таиться ошибка? 

--
Вообще странно как-то получилось... сам я этот код и метод, в частности не писал, вроде из достоверного источника взял.
 Ради того, что бы проще было разобраться с примерной логикой реализации одного веб-компонента, решил по порядку до него пройти известный пример "ToDo Application" http://www.hpi.uni-potsdam.de/hirschfeld/seaside/tutorial. Но что-то не далеко ушёл.., вроде всё по порядку и без самодеятельности, однако вот.., практически на первых же паре страниц...   :(

среда, 11 сентября 2013 г., 22:12:10 UTC+4 пользователь Саша написал:
Означает что переменная с таким именем уже существуе.
Если попытаться скомпилировать вот такой метод:
testing
    | aVar |
    
    aVar := Object new.
    
    [| aVar |  aVar new] forkAt: 15

Pharo выдает ошибку:

testing
    | aVar |
   
    aVar := Object new.
   
    [|  Name is already defined ->aVar |  aVar new] forkAt: 15
   


2013/9/11 Dennis Schetinin <[hidden email]>
О каком Smalltalk-е речь-то? В Pharo я такой строки не нахожу совсем… в отличие от Name already — такие слова встречаются несколько раз.

По описанию, конечно, похоже на глюк (с учетом того, что Smalltalk-и не особо надежны в плане отката изменений) , но кто знает… Метод с таким же именем, по идее, мешаться не может, так как при совпадении имен новая версия просто "перекрывает" предыдущую. Это, скорее, может относиться к имени переменной или (или в частности?) имени класса.


--

Best regards,


Dennis Schetinin



11 сентября 2013 г., 21:33 пользователь Genosse Alex <[hidden email]> написал:

Я конечно понимаю дословный перевод " Name already defined ->" Но что то не пойму в чём дело...
Это то, что метод с таким именем где то используется или что то другое?

В процессе экспериментов получил ошибку (другую). стал править один метод и получил  Name already defined -> Странно, что если даже возвращаю метод к исходному состоянию при Accept(е) опять    Name already defined ... Я вроде откатил все изменения, а один чёрт

Как искать корень зла? Вроде я ничего не already defined... :(

Я понимаю что сложно наверное сказать не видя кода, но что это может быть, какие варианты, как можно искать причины?  

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес sugr+uns...@googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес sugr+uns...@googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Genosse
initializeListComponent
 self listComponent: StListComponent new.
 self listComponent
  sortBlock: [:items |
   items sortBy: [:a :b | a deadline < b deadline]];
  renderItemBlock: [:task :html |
   self renderTask: task asRowOn: html].
self showPendingTasks.

ругается на showPendingTasks и на :task в renderItemBlock:

showPendingTasks
 self listComponent
  filterBlock: [:item | item isPending].



среда, 11 сентября 2013 г., 22:40:25 UTC+4 пользователь Саша написал:
Метод в студию.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Genosse
Похоже это всё не то... 
Я скачал сейчас код готового приложения из данного примера.
Открыл. Там эти методы один в один те же и такой ошибки нет...
Но окружение их (др. методы, классы) несколько отличаются. Это естественно из-з того,что скаченный пакет это конены резльтат примера, а я завис в самом начале.

Но ясно, что причина " Name already defined" за пределами этого метода, но как это может быть, в принципе какие возможны варианты возникновения ошибки?
Я не заметил, что бы кто-то в сети жаловался на некорректность этого тутриала...

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Alex Kogan
In reply to this post by Genosse
Класс содеражащий метод initializeListComponent уже задекларировал instance variable по прозвищу task.
Например
Object subclass: #Testing
 instanceVariableNames: 'task'

test
[:list | [: Name is already defined ->  task | task testing] value: list] fork



2013/9/11 Genosse Alex <[hidden email]>
initializeListComponent
 self listComponent: StListComponent new.
 self listComponent
  sortBlock: [:items |
   items sortBy: [:a :b | a deadline < b deadline]];
  renderItemBlock: [:task :html |
   self renderTask: task asRowOn: html].
self showPendingTasks.

ругается на showPendingTasks и на :task в renderItemBlock:

showPendingTasks
 self listComponent
  filterBlock: [:item | item isPending].



среда, 11 сентября 2013 г., 22:40:25 UTC+4 пользователь Саша написал:
Метод в студию.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Genosse
Блиннн... Спасибо. 
Вот я растяпа...
Когда пытался понять и исправить первую возникшую ошибку "doesNotUnderstand" создал пару методов доступа.
Потом, как получил эту ошибку всю отсебятину удалил, а имя переменой task из описания класса не вычистил...

Сорри за глупые вопросы. 

среда, 11 сентября 2013 г., 23:00:35 UTC+4 пользователь Саша написал:
Класс содеражащий метод initializeListComponent уже задекларировал instance variable по прозвищу task.
Например
Object subclass: #Testing
 instanceVariableNames: 'task'

test
[:list | [: Name is already defined ->  task | task testing] value: list] fork



2013/9/11 Genosse Alex <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="5xZYk9prkKwJ">gen...@...>
initializeListComponent
 self listComponent: StListComponent new.
 self listComponent
  sortBlock: [:items |
   items sortBy: [:a :b | a deadline < b deadline]];
  renderItemBlock: [:task :html |
   self renderTask: task asRowOn: html].
self showPendingTasks.

ругается на showPendingTasks и на :task в renderItemBlock:

showPendingTasks
 self listComponent
  filterBlock: [:item | item isPending].



среда, 11 сентября 2013 г., 22:40:25 UTC+4 пользователь Саша написал:
Метод в студию.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="5xZYk9prkKwJ">sugr+uns...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Что подразумевается под ошибкой Name already defined ?

Alex Kogan
Ошибки очень редко бывают мудреными. Частенько приходиться звать соседа, чтобы через плече поглядел, сразу начинают находиться. Или он меня зовет поговорить.


2013/9/11 Genosse Alex <[hidden email]>
Блиннн... Спасибо. 
Вот я растяпа...
Когда пытался понять и исправить первую возникшую ошибку "doesNotUnderstand" создал пару методов доступа.
Потом, как получил эту ошибку всю отсебятину удалил, а имя переменой task из описания класса не вычистил...

Сорри за глупые вопросы. 

среда, 11 сентября 2013 г., 23:00:35 UTC+4 пользователь Саша написал:
Класс содеражащий метод initializeListComponent уже задекларировал instance variable по прозвищу task.
Например
Object subclass: #Testing
 instanceVariableNames: 'task'

test
[:list | [: Name is already defined ->  task | task testing] value: list] fork



2013/9/11 Genosse Alex <[hidden email]>
initializeListComponent
 self listComponent: StListComponent new.
 self listComponent
  sortBlock: [:items |
   items sortBy: [:a :b | a deadline < b deadline]];
  renderItemBlock: [:task :html |
   self renderTask: task asRowOn: html].
self showPendingTasks.

ругается на showPendingTasks и на :task в renderItemBlock:

showPendingTasks
 self listComponent
  filterBlock: [:item | item isPending].



среда, 11 сентября 2013 г., 22:40:25 UTC+4 пользователь Саша написал:
Метод в студию.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес sugr+uns...@googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.