using System;
using System.Drawing;
using System.Net.Http;
using System.Windows.Forms;
using Nemiro.OAuth;
using Nemiro.OAuth.LoginForms;
namespace InstagramWinForms
{
public partial class Form1 : Form
{
// базовый адрес API
private const string API_BASE_URL = "https://api.instagram.com/v1";
// элемент для хранения полученных изображений
private ImageList ImageList = new ImageList();
// элемент для вывода изображений
private ListView ListView1 = new ListView();
private string AccessToken;
public Form1()
{
InitializeComponent();
// размер изображений 150x150px, 16bit
this.ImageList.ImageSize = new Size(150, 150);
this.ImageList.ColorDepth = ColorDepth.Depth16Bit;
// настраиваем список для вывода
this.ListView1.View = View.LargeIcon;
this.ListView1.LargeImageList = this.ImageList;
this.ListView1.Dock = DockStyle.Fill;
// добавляем список на форму
this.Controls.Add(this.ListView1);
}
private void Form1_Load(object sender, EventArgs e)
{
// запрос на получение маркера доступа
this.GetAccessToken();
}
private void GetAccessToken()
{
// создаем форму для Instagram
// ВНИМАНИЕ: используйте собственный идентификатор и ключ
// получить идентификатор и ключ можно на сайте instagram:
// https://www.instagram.com/developer/clients/manage/
var login = new InstagramLogin
(
// client id вашего приложения
"9fcad1f7740b4b66ba9a0357eb9b7dda",
// client key вашего приложения
"3f04cbf48f194739a10d4911c93dcece",
// требуется адрес возврата,
// можно использовать указанный,
// но лучше сделать свой
"http://oauthproxy.nemiro.net/",
// права доступа
// https://www.instagram.com/developer/authorization/
// для public_content (и возможно других) убедитесь,
// что в настройках приложения (на сайте instagram)
// в разделе Permissions нет никаких требований
// (если требования есть, то чтобы все работало,
// нужно их удовлетворить :-) ...)
scope: "basic public_content",
// требуем получить данные профиля пользователя
loadUserInfo: true
);
// привязываем форму авторизации к текущей форме
login.Owner = this;
// показываем форму
login.ShowDialog();
if (login.IsSuccessfully)
{
// все прошло успешно, запоминаем маркер доступа
this.AccessToken = login.AccessToken.Value;
// выводим в заголовок текущей формы имя пользователя
this.Text = (login.UserInfo.DisplayName ?? login.UserInfo.UserName);
// получаем изображения
this.GetRecentMedia();
}
else
{
MessageBox.Show("Error...", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void GetRecentMedia()
{
// отправляем запрос на получение изображений
OAuthUtility.GetAsync
(
String.Format
(
"{0}/users/self/media/recent?access_token={1}",
API_BASE_URL,
this.AccessToken
),
// результат запроса будет передан в метод GetRecentMedia_Result
callback: GetRecentMedia_Result
);
}
private async void GetRecentMedia_Result(RequestResult result)
{
if (result.StatusCode == 200)
{
// получили успешный ответ
// обрабатываем его
foreach (UniValue item in result["data"])
{
// загружаем текущую картинку
using (var client = new HttpClient())
{
var s = await client.GetStreamAsync(item["images"]["thumbnail"]["url"].ToString());
// добавляем изображение в список
Invoke(new Action(() => this.ImageList.Images.Add(Image.FromStream(s))));
}
// создаем элемент для вывода в список
var image = new ListViewItem();
// название изображения
image.Text = item["caption"]["text"].ToString();
// индекс изображения в списке (ImageList)
image.ImageIndex = this.ImageList.Images.Count - 1;
// добавляем элемент в список
Invoke(new Action(() => this.ListView1.Items.Add(image)));
}
}
else
{
this.ShowError(result);
}
}
private void ShowError(RequestResult result)
{
if (result["meta"]["error_message"].HasValue)
{
MessageBox.Show
(
result["meta"]["error_message"].ToString(),
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
else
{
MessageBox.Show
(
result.ToString(),
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
}
private void button1_Click(object sender, EventArgs e)
{
this.GetRecentMedia();
}
}
}
// .* - может съесть лишнего,
// если есть возможность, лучше строго ограничивать
// в данном случае четкой границей
// может служить открытие следующего тега (<)
// "(.+?)<div" имеет смысл использовать, если в искомом тексте могут быть другие теги
// class="margin-top-xx-small" тоже можно использовать,
// но только если это действительно необходимо
var pattern = @"<div(\s+)class=""currency-table__rate__text"">(?<data>[^\<]+)<";
var reg = new Regex(pattern, RegexOptions.IgnoreCase);
var m = reg.Match(value); // вместо value переменная с данными для разбора
var result = m.Groups["data"].Value.Trim();
Console.WriteLine(result);
Server=localhost;Database=example;UID=username;Password=password
var connectionString = "Server=localhost;Database=example;UID=username;Password=password";
using (var connection = new MySqlConnection(connectionString))
{
// открываем соединение
connection.Open();
// создаем команду
var cmd = new MySqlCommand();
cmd.Connection = connection;
cmd.CommandText = "SELECT * FROM table1";
// создаем адаптер
var adapter = new MySqlDataAdapter(cmd);
// создаем таблицу
var table = new DataTable();
// получаем данные в таблицу
adapter.Fill(table);
// выводим
foreach (DataRow row in table.Rows)
{
Console.WriteLine(row[0]);
}
}
<configuration>
<startup>
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0.50727" />
</startup>
</configuration>
также хотелось бы узнать как компилировать в месте с ним.
private Button FirstButton = null;
void S_MouseClick(object sender, MouseEventArgs e)
{
var button = (sender as Button);
if (this.FirstButton == null)
{
// это первая кнопка в текущей сессии,
// запоминаем ссылку на кнопку
this.FirstButton = button;
}
else
{
// это вторая кнопка в текущей сессии
// сравниваем текст с первой
if (this.FirstButton.Text == button.Text)
{
Console.WriteLine("Текст совпадает!");
// меняем свойства кнопок
this.FirstButton.Text = button.Text = "--";
this.FirstButton.Enabled = button.Enabled = false;
}
else
{
Console.WriteLine("Текст не совпадает.");
}
// сбрасываем выбор, запуская тем самым новую сессию
this.FirstButton = null;
}
}
HttpContext.Current.Response.RedirectToRoute
(
new
{
controller = "Home",
action = "Index"
}
);
var routeData = ((System.Web.Mvc.MvcHandler)HttpContext.Current.Handler).RequestContext.RouteData;
var urlHelper = new System.Web.Mvc.UrlHelper(HttpContext.Current.Request.RequestContext);
var url = urlHelper.Action("Index", "Home");
// счетчик секунд
int secondsCounter = 0;
var s500A2 = new System.Timers.Timer();
// интервал - одна секунда
s500A2.Interval = 1000;
// обработчик истечения интервала
s500A2.Elapsed += (sender, e) => { // имена sender и e можно поменять, если будут проблемы
Console.WriteLine("Прошла секунда");
// увеличиваем значение счетчика
secondsCounter++;
if (secondsCounter >= 10)
{
Console.WriteLine("Всего прошло 10 секунд");
secondsCounter = 0;
}
};
s500A2.Start();
// интервал - одна секунда
s500A2.Interval = 1000;
s500A2.Elapsed += (sender, e) => {
Console.WriteLine("Прошла секунда: {0:HH:mm:ss.fff}", DateTime.Now);
};
// На выходе будет примерно это:
// Прошла секунда: 14:18:20.950
// Прошла секунда: 14:18:21.964
// Прошла секунда: 14:18:22.978
// Прошла секунда: 14:18:23.992
// Прошла секунда: 14:18:25.006 // потеряли 14:18:24
// Прошла секунда: 14:18:26.020
// Прошла секунда: 14:18:27.034
int lastSecond = 0;
// интервал - десять миллисекунд
s500A2.Interval = 10;
s500A2.Elapsed += (sender, e) => {
int currentSecond = DateTime.Now.Second;
if (currentSecond != lastSecond)
{
Console.WriteLine("Прошла секунда: {0:HH:mm:ss.fff}", DateTime.Now);
lastSecond = currentSecond;
}
};
var result = new Dictionary<int, List<object>>();
foreach (var item in arrComputer)
{
var c = (Comp)item;
// проверяем, есть такой год в коллекции или нет
if (!result.ContainsKey(c.year))
{
// такого года еще нет, добавляем
result.Add(c.year, new List<object> { c });
}
else
{
// год есть, добавляем запись в него
result[c.year].Add(c);
}
}
// в result будет коллекция: год-компьютеры
foreach (int year in result.Keys)
{
Console.WriteLine
(
"В {0} году на Земле вылупилось компьютеров: {1}",
year,
result[year].Count
);
if (result[year].Count > 1)
{
Console.WriteLine("Да это просто демографический взрыв какой-то!");
foreach (var item in result[year])
{
Console.WriteLine("+ {0}", ((Comp)item).marka);
}
}
}
# клонируем рекурсивно, т.к. там ссылка на другой репозиторий
git clone --recursive https://github.com/yar229/WebDavMailRuCloud.git
# тянем последнюю версию nuget, если таковой еще нет
wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -O nuget.exe --no-check-certificate
# восстанавливаем пакеты nuget
mono nuget.exe restore WebDavMailRuCloud/WebDAVMailRuCloud.sln
# пробуем выполнить сборку решения
MONO_IOMAP=case xbuild WebDavMailRuCloud/WebDAVMailRuCloud.sln
MailRuCloudApi.cs(1020,51): error CS0019: Operator `>' cannot be applied to operands of type `long' and `object'
return (fileStream.Length > 0) as object;
MONO_IOMAP=case xbuild WebDavMailRuCloud/WebDAVMailRuCloud.sln
18 Warning(s)
0 Error(s)
mono WebDavMailRuCloud/WDMRC.Console/bin/Debug/wdmrc.exe --help
log4net:ERROR Could not create Appender [ColoredConsoleAppender] of type [log4net.Appender.ColoredConsoleAppender]. Reported error follows.
System.EntryPointNotFoundException: GetConsoleOutputCP
...
nano WebDavMailRuCloud/WDMRC.Console/bin/Debug/wdmrc.exe.config
<log4net threshold="OFF" />
mono WebDavMailRuCloud/WDMRC.Console/bin/Debug/wdmrc.exe --help
WebDAVCloudMailRu 1.0.0.0
yar229@yandex.ru
-p, --port Required. WebDAV server port
-l, --login Required. Login to Mail.ru Cloud
-s, --password Required. Password to Mail.ru Cloud
--maxthreads (Default: 5) Maximum concurrent connections to cloud.mail.ru
--user-agent "browser" user-agent
--help Display this help screen.
--version Display version information.
Unhandled Exception:
System.InvalidOperationException: Property 'enabled' not found in configuration element
at System.Configuration.ConfigurationElement.get_Item (System.String property_name) <0xb50f5608 + 0x000a7> in :0
at System.Configuration.ConfigurationElement.get_Item (System.Configuration.ConfigurationProperty property) <0xb50f55d8 + 0x0001f> in :0
at System.Net.Configuration.DefaultProxySection.get_Enabled () <0xb506a270 + 0x0001b> in :0
at MailRuCloudApi.Account.Login () <0xb50699f8 + 0x000af> in :0
<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>
nano WebDavMailRuCloud/MailRuNetCloudClient/MailRuCloudApi/Account.cs
MONO_IOMAP=case xbuild WebDavMailRuCloud/WebDAVMailRuCloud.sln
WebDAV server running. Press 'x' to quit.
<system.webServer>
<rewrite>
<rules>
<rule name="All" patternSyntax="Wildcard" stopProcessing="true" enabled="true">
<match url="*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}"
matchType="IsFile"
negate="true"
pattern=""
ignoreCase="false"
/>
</conditions>
<action type="Rewrite" url="index.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
response.AddHeader("Content-Disposition", "attachment; filename='" + file.Name + "';");
// или
// response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.Name + "\";");
$good[$spec] = array('mall', 'discount', 'promotion');
// ^
foreach($good[$spec] as $mall) {
// ^
// ...
}
php.net/manual/ru/language.types.array.php
Почему $foo[bar] неверно?
Всегда заключайте в кавычки строковый литерал в индексе ассоциативного массива. К примеру, пишите $foo['bar'], а не $foo[bar]. Но почему? Часто в старых скриптах можно встретить следующий синтаксис:<?php $foo[bar] = 'враг'; echo $foo[bar]; // и т.д. ?>
Это неверно, хотя и работает. Причина в том, что этот код содержит неопределенную константу (bar), а не строку ('bar' - обратите внимание на кавычки). Это работает, потому что PHP автоматически преобразует "голую строку" (не заключенную в кавычки строку, которая не соответствует ни одному из известных символов языка) в строку со значением этой "голой строки". Например, если константа с именем bar не определена, то PHP заменит bar на строку 'bar' и использует ее.
class TableManagement extends React.Component {
constructor(props) {
super(props);
this.state = {
head_names: ['qwe0', 'qwe1'],
rows: [
[1, 2],
[3, 4]
]
};
}
AddRow() {
let newRows = this.state.rows;
newRows.push([0, 0]);
this.setState({rows: newRows});
}
render() {
return (
<div>
<Table head={this.state.head_names} rows={this.state.rows} />
<hr />
<button onClick={ this.AddRow.bind(this) }>Add row</button>
</div>
);
}
}
class Table extends React.Component {
render() {
return (
<table>
<thead>
{this.genHead()}
</thead>
<tbody>
{this.genRow()}
</tbody>
</table>
);
}
genHead() {
var head = this.props.head;
return head.map(function(v, i) {
return (
<th key={'th' + i}>
{v}
</th>
);
});
}
genRow() {
var rows = this.props.rows;
return rows.map(function(v, i) {
var tmp = v.map(function(v2, j) {
return (
<td key={'td' + i + '_' + j}>
{v2}
</td>
);
});
return (
<tr key={'tr' + i}>
{tmp}
</tr>
)
});
}
}
ReactDOM.render(
<TableManagement />,
document.getElementById('root')
);