Folder Sharing в Google Docs

Категории: Интернет, Программы, Разработка ПО
Тэги: , , ,

До сих пор средствами Google Docs можно было открывать общий доступ только на документы, и, строго говоря, с точки зрения пользовательского интерфейса ничего не поменялось. Тем не менее, в новой редакции Google Docs API эта фича стала доступной.

Я написал небольшое приложение на Java, для автоматизации этого процесса, до тех пор пока нововведение не будет анонсировано официально.

Для запуска необходимо настроить, например, Eclipse таким образом, и в функцию main скопировать следующий код:

List<String> folderNames = Arrays.asList("Folder1", "Folder2", "...");
List<String> userMails = Arrays.asList("user1@domain.com", "user2@domain.com", "...");
String role = "reader"; // or "owner", "writer", "peeker", "none"
String appsName = "MyComp-MyApps-version";
String username = "username";
String password = "password";
 
if(!role.equals("reader")
&& !role.equals("writer")
&& !role.equals("owner")
&& !role.equals("none")
&& !role.equals("peeker"))  {
	return;
}
 
DocsService client = new DocsService(appsName);
client.setUserCredentials(username, password);
 
DocumentQuery query = new DocumentQuery(new URL("http://docs.google.com/feeds/default/private/full/-/folder"));
DocumentListFeed resultFeed = client.getFeed(query, DocumentListFeed.class);
for (DocumentListEntry entry : resultFeed.getEntries()) {
	for(String name : folderNames) {
		if(entry.getTitle().getPlainText().equalsIgnoreCase(name)) {
			for(String mail : userMails) {
				AclRole aclRole = new AclRole(role);
				AclScope aclScope = new AclScope(AclScope.Type.USER, mail);
				AclEntry aclEntry = new AclEntry();
				aclEntry.setRole(aclRole);
				aclEntry.setScope(aclScope);
				client.insert(new URL(entry.getAclFeedLink().getHref()), aclEntry);
			}
		}
	}
	AclFeed aclFeed = client.getFeed(new URL(entry.getAclFeedLink().getHref()), AclFeed.class);
	for (AclEntry aclEntry : aclFeed.getEntries()) {
	  System.out.println(
		aclEntry.getScope().getValue() + " (" + aclEntry.getScope().getType() + ") : " + aclEntry.getRole().getValue());
	}
}

Здесь списки folderNames и userMails необходимо заполнить соответствующими значениями. Параметр “…” в сигнатуре вызова функции asList – отсебятина, предназначенная просто показать, что количество параметров функции можно смело расширять. В конечном варианте когда его надо убрать. Вместо username и password вписать свои явки и пароли для доступа в к приложениям Google. Ну и роль выставить такую, какую требуется.

Теперь пользователи, с которыми вы разделили доступ к папке, смогут посмотреть на ее содержимое по ссылке: http://docs.google.com/#folders-shared-with-me

Тем не менее, не все сразу безоблачно заработает. Пользователи, которым вы разрешили доступ на изменение, не увидят созданные ими документы в этой папке. Чтобы все заработало как полагается, им необходимо добавить вас в соавторы их документов, а вам необходимо будет перетащить эти документы из общего списка в расшареную папку.

Про опции /debug /optimize компилятора C#

Категории: Разработка ПО
Тэги: ,

Неплохая статейка, описывающая роли ключей /debug /optimize, компилятора C#:

http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx

Sketch in .NET VS Event Toaster

Категории: Программы, Разработка ПО
Тэги: , , , , ,

Как бы это не было смешно, анонсированное в июле прошлого года обновление Sketch in .NET Visual Studio Event Toaster пролежало все это время со статусом Hidden.
Но, как говориться, лучше поздно, чем никогда.

Исправляю свою ошибку, вот правильная ссылка на релиз:
http://vspopuptoaster.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=15414

Страница проекта:
http://vspopuptoaster.codeplex.com/

По следам PDC. C# 4.0 Features. Dynamycally Typed Objects.

Категории: Разработка ПО
Тэги: , , ,

Небольшой обзор того, что нам готовит новая версия спецификации языка.
Смена первой цифры произошла благодаря четырём основным фичам:

  • Dynamycally Typed Objects
  • Optional and Named Prameters
  • Improved COM Interoperability
  • Co- and Conra-variance

Сегодня подробней рассмотрим первую.

Dynamycally Typed Objects
Динамическая система типов является, пожалуй, самым основным нововведением языка. Судя по лекциям с PDC 2008, c точки зрения архитектуры .NET добавился еще один компонент – DLR (dynamic object runtime), являющийся, по сути, надстройкой над CLR. С точки зрения языка добавилось ключевое слово dymanic. И одноименный тип добавился в .NET Type System.
Какое время назад Microsoft Research утверждала, что реализация будет происходить так: на момент компиляции объект будет не типизирован, а тэгирован, и на момент выполнения тег заменяется на свежевычесленный тип и вместо “неопределенного” типа подставляется “настоящий” и дальше все работает по старой схеме. Собственно DLR этим и должен заниматься.
Но что же происходит на самом деле?
Read the rest of this entry »

Прекращение подачи видеосигнала на дисплей

Категории: Программы, Разработка ПО
Тэги: , , ,

В связи с особенностями работы монитора при подключении второго источника изображения при активном первом, написал небольшую программку, которая посылает сообщение, прекращающее выдачу видеосигнала на дисплей. Сообщение идентично тому, что посылается при отключении дисплея в режиме PowerSaving.

За все отвечает системное сообщение WM_SYSCOMMAND с параметрами SC_MONITORPOWER и 2. LPARAM со значением 2 соответствует отключению дисплея. Значение параметра -1 – включает дисплей, 1 – вводит дисплей в режим Stand By (в основном актуально для ноутбуков).

Код получился крайне незамысловатый:

static class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
 
    static IntPtr SC_MONITORPOWER = new IntPtr(0xF170);
    const uint WM_SYSCOMMAND = 0x0112;
    static IntPtr MONITOR_OFF = new IntPtr(2);
    static IntPtr HWND_BROADCAST = new IntPtr(0xffff);
 
    [STAThread]
    static void Main()
    {
        SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
    }
}