The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]



"isomorphic-git, реализация Git на JavaScript"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от opennews (??) on 17-Май-18, 11:34 
Опубликован (https://github.com/isomorphic-git/isomorphic-git/releases/ta...) выпуск проекта isomorphic-git 0.13.0 (https://isomorphic-git.github.io/), в рамках которого развивается реализация Git на языке JavaScript, нацеленная на предоставление 100% переносимости с классическим Git и способная выполняться в web-браузере или в качестве модуля для платформы Node.js. Код проекта поставляется (https://github.com/isomorphic-git/isomorphic-git) под лицензией MIT.

Проект изначально написан на чистом JavaScript (без компиляции в JavaScript при помощи Emscripten)  и базируется на применении WebWorkers и ServiceWorkers. Isomorphic-git позволяет читать и записывать данные в локальные Git-репозитории, выполнять операции push и fetch с удалёнными репозиториями, например, с GitHub. Для работы с Git-репозиториями предлагается утилита isogit, поддерживающая большую часть команд git. Для встраивания отдельных возможностей Git в web-приложения предоставляется модульный API, позволяющий включать только необходимую функциональность. Как и в канонической реализации Git, в isomorphic-git все операции выполняются путём изменения файлов в каталоге ".git".

URL: https://news.ycombinator.com/item?id=17083807
Новость: https://www.opennet.ru/opennews/art.shtml?num=48615

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "isomorphic-git, реализация Git на JavaScript"  +21 +/
Сообщение от Аноним (??) on 17-Май-18, 11:34 
Но зачем?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "isomorphic-git, реализация Git на JavaScript"  +11 +/
Сообщение от Аноним (??) on 17-Май-18, 11:45 
Чтобы набраться опыта, изучив тонкости JS. Всяко интереснее чем очередной калькулятор по учебнику.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

32. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от anonymous (??) on 17-Май-18, 20:59 
Неужели JS на столько сложен, что его тонкости можно только так изучить? А то тут фанбои совсем другое вещают...
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

42. "isomorphic-git, реализация Git на JavaScript"  –1 +/
Сообщение от Аноним (??) on 17-Май-18, 22:30 
https://youtu.be/RGkIsUBfanQ?t=1m20s

Ну и дальше смотрите "why javascript is sucks".

Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

56. "isomorphic-git, реализация Git на JavaScript"  –2 +/
Сообщение от Аноним (??) on 18-Май-18, 12:11 
Сложен. Но входной порог при этом низкий.
Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

58. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от macfaq on 18-Май-18, 12:29 
> Неужели JS на столько сложен, что его тонкости можно только так изучить?

Наверное достаточно наличия книжки с названием "Javascript: The Good Parts" чтобы что-то заподозрить (:

Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

4. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от Аноним (??) on 17-Май-18, 11:46 
Чтобы называться так же, но быть несовместимым, очевидно же.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

14. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от Bitten Apple on 17-Май-18, 13:09 
Для online IDE, например
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

40. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Вареник on 17-Май-18, 21:31 
> Для online IDE, например

Непременно в телефоне, а лучше в "умных часах" :)

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

55. "isomorphic-git, реализация Git на JavaScript"  –1 +/
Сообщение от Диносуслик on 18-Май-18, 11:45 
Если брать тот же с9, то там нормальный гит, т.к. ОС запускается в контейнерах, гит нормальный и все как полагается.

Зачем именно в JS - не ясно.

Ответить | Правка | ^ к родителю #40 | Наверх | Cообщить модератору

65. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Аноним (??) on 19-Май-18, 16:29 
> Зачем именно в JS - не ясно.

Скоро электрон перекочует в прошивку и JS сразу станет системным языгом, а старперы с их старыми плюсами и дривнющим си будят завидовать и кусать локди! Вот!

Ответить | Правка | ^ к родителю #55 | Наверх | Cообщить модератору

28. "isomorphic-git, реализация Git на JavaScript"  –4 +/
Сообщение от Аноним (??) on 17-Май-18, 18:41 
Затем, что под нормальной свободной лицензией, а не под вирусно-несвободным GPL.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

2. "isomorphic-git, реализация Git на JavaScript"  +13 +/
Сообщение от Аноним (??) on 17-Май-18, 11:37 
Фронтендеры, успокойтесь уже.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

7. "isomorphic-git, реализация Git на JavaScript"  –21 +/
Сообщение от callbackjump on 17-Май-18, 12:16 
Почему? Почему все думают, что JS медленнее нерушимого Си? Оптимизация движка JS скоро переплюнет оптимизации компилятора Си (кто в 21 веке пашет землю иголкой?), чего уже Rust ментально достиг, ускоряя свои имплементационные возможности стремительно завоёвывая умы думающих программистов.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

9. "isomorphic-git, реализация Git на JavaScript"  +6 +/
Сообщение от Аноним (??) on 17-Май-18, 12:29 
Потому что тесты производительности не обманешь как и тесты на потребление памяти. Потому что си и с++ при правильной организации разработки и наличии статического анализа безопасней js-a. Потому что для С-подобных языков не нужен рантайм.
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

11. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Владимир email(??) on 17-Май-18, 12:45 
С-подобный это про синтаксис, javaScript как раз к ним и относится, так что вы тут некорректно выразились.
Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

13. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Анониммм on 17-Май-18, 13:02 
Есть Си-подобный синтаксис, да. Но в данном человек имел ввиду отсутствие вспомогательных средств для обеспечения работоспособности приложение, подобно тому, как работают программы, написанные на Си, и это не является некорректным выражением. Это всё равно что при упоминании экспоненты сразу думать про экспоненциальный рост.
Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

27. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от й on 17-Май-18, 18:25 
> с++
> не нужен рантайм.

ага, а libstdc++ фикция и не существует.
строго говоря, это такой же рантайм, т.е. имплементация stdlib, без наличия которой в системе ничего не запустится.

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

29. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Anonymus on 17-Май-18, 19:05 
Статически линкуй
Ответить | Правка | ^ к родителю #27 | Наверх | Cообщить модератору

38. "isomorphic-git, реализация Git на JavaScript"  +2 +/
Сообщение от Вареник on 17-Май-18, 21:30 
> Статически линкуй

Рантайм - это все что обслуживает выполнение программы, чтобы main() вывело Hello World, но не включая ядро.

Например: libc - рантайм С. Без разницы, статически или динамически прилинковать - это все равно будет рантайм для С программы.

Ответить | Правка | ^ к родителю #29 | Наверх | Cообщить модератору

43. "isomorphic-git, реализация Git на JavaScript"  –3 +/
Сообщение от draw1 on 17-Май-18, 22:45 
> Рантайм - это все что обслуживает выполнение программы, чтобы main() вывело Hello World, но не включая ядро.

Ага. Но только во время ВЫПОЛНЕНИЯ, а не во время компиляции (по секрету: поэтому и называется RUNtime).

После статической линковки можешь удалить то с чем линковал, а "hello, world" будет по прежнему выводиться. А это значит что во время выполнения не используется, то есть это не рантайм. По определению.

Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

46. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Аноним (??) on 18-Май-18, 01:42 
При чём тут статическая линковка вообще? Просто рантайм будет идти вместе с прогой и последняя будет больше весить. Вон бинарники после раста или го весят по несколько мегабайт даже если это hello world. Как раз из-за рантайма.
Ответить | Правка | ^ к родителю #43 | Наверх | Cообщить модератору

49. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от angra (ok) on 18-Май-18, 03:08 
Когда ты слинковал статически либу, ты фактически сделал ее копию внутрь бинарника и эта копия используется при выполнении программы. И не играет роли, что ты там сделал с оригиналом. С тем же успехом ты можешь сделать копию интерпретатора js, удалить оригинал и запустить js в копии, после чего заявить, что у js тоже нет рантайма, ведь ты удалил оригинал.
Ответить | Правка | ^ к родителю #43 | Наверх | Cообщить модератору

50. "isomorphic-git, реализация Git на JavaScript"  –1 +/
Сообщение от Аноним (??) on 18-Май-18, 05:05 
> Рантайм - это все что обслуживает выполнение программы, чтобы main() вывело Hello World, но не включая ядро.

а если bare-metal запускаешь вывод Hello World в UART - что будешь считать рантаймом?

Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

37. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Crazy Alex (ok) on 17-Май-18, 21:29 
Ерунду говоришь. Без этой либы на плюсах приложение мобрать можно (она и сама на плюсах, собственно). А на джаваскрипте без рантайма жить нельзя. Потому как динамика проклятая.
Ответить | Правка | ^ к родителю #27 | Наверх | Cообщить модератору

45. "isomorphic-git, реализация Git на JavaScript"  –1 +/
Сообщение от й on 18-Май-18, 00:24 
давай зайдём с другой стороны. есть golang. у него статические линкуемые бинарики со стандартными и не очень библиотеками на выходе. так вот, вопрос: это всё прилинкованное в файл (там зелёные треды, каналы и прочее) -- это, что, не рантайм? рантайм. так вот, у c++ есть такой же. прилинкованный stdlib -- это вполне себе рантайм, т.е. 3rd party code, который выполняется во время исполнения программы. реальные приложения в c++ используют stdlib и ты отлично это знаешь.
Ответить | Правка | ^ к родителю #37 | Наверх | Cообщить модератору

51. "isomorphic-git, реализация Git на JavaScript"  –1 +/
Сообщение от Anonim (??) on 18-Май-18, 07:38 
stdlib это стандартная библиотека функций. после компиляции линкуется не она целиком а только те кусочки которые ты явно вызываешь. + ты можешь использовать любой другой набор функций или написать свой или не использовать вообще ничего.
Ответить | Правка | ^ к родителю #45 | Наверх | Cообщить модератору

47. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от angra (ok) on 18-Май-18, 02:54 
Собрать то конечно можно, вот только окажется, что значительная часть функционала плюсов у тебя отсутствует и практически любую программу, включая helloworld, надо переписывать.
Ответить | Правка | ^ к родителю #37 | Наверх | Cообщить модератору

12. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от Аноним (??) on 17-Май-18, 13:00 
Интерпретатор JS, написанный на C, станет быстрее С? Дак пусть сразу быстрее асмы делают, что мелочиться то.
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

17. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Аноним (??) on 17-Май-18, 13:48 
А написанным на самом JS ещё быстрее!
Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

22. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Аноним (??) on 17-Май-18, 15:21 
Внезапно: а почему бы и нет? См. пример с PyPy.
Порой чувствуешь себя умнее сишников, объясняя им такие банальные вещи.
Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

31. "isomorphic-git, реализация Git на JavaScript"  –2 +/
Сообщение от нурок on 17-Май-18, 19:18 
> Внезапно: а почему бы и нет? См. пример с PyPy.
> Порой чувствуешь себя умнее сишников, объясняя им такие банальные вещи.

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

Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору

33. "isomorphic-git, реализация Git на JavaScript"  +2 +/
Сообщение от anonymous (??) on 17-Май-18, 21:03 
> Внезапно: а почему бы и нет? См. пример с PyPy.
> Порой чувствуешь себя умнее сишников, объясняя им такие банальные вещи.

Текущие версии PyPy транслируются из RPython в Си и компилируются (c) википедия

Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору

44. "isomorphic-git, реализация Git на JavaScript"  –1 +/
Сообщение от Аноним (??) on 17-Май-18, 23:36 
Ну и? Что мешает проделывать аналогичное с кодом на JS на лету? Собственно, это сейчас и делается, но все равно находятся ламеры у которых в голове не укладывается.
Ответить | Правка | ^ к родителю #33 | Наверх | Cообщить модератору

60. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Доктор (??) on 18-Май-18, 15:19 
ключевое слово "emscripten"

Но все равно работает существенно медленнее. Проверено и не раз, так как вот уже третий год разрабатываю и использую.

Ответить | Правка | ^ к родителю #44 | Наверх | Cообщить модератору

62. "isomorphic-git, реализация Git на JavaScript"  –1 +/
Сообщение от Аноним (??) on 18-Май-18, 15:42 
Это совсем другое направление компиляции, плюс тормозить может из-за того что движки JS не оптимизированы под код выдаваемый emscripten.
Ответить | Правка | ^ к родителю #60 | Наверх | Cообщить модератору

30. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от нурок on 17-Май-18, 19:14 
ну вот не любят люди лишних прослоек.. ощущения не те..
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

41. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Вареник on 17-Май-18, 21:34 
> стремительно завоёвывая умы думающих программистов.

Это типа определять творческость креаклов по принципу заднепроходности.

А "думание программиста" - по переписыванию чужого готового на языке-изврате.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

53. "isomorphic-git, реализация Git на JavaScript"  +2 +/
Сообщение от Аноним (??) on 18-Май-18, 10:16 
Просто оголтелая бестолочь с жс головного мозга, кроме как на вопли о крутизне своего язычишки и переписывания всего подряд по нескольку раз, ни на что больше не способна. Это факт.
Ответить | Правка | ^ к родителю #41 | Наверх | Cообщить модератору

52. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от qrKot on 18-Май-18, 10:10 
Потому что есть такая штука: формальная (она же "математическая") логика...
Учитывая то, что сам JS вполне себе написан на C, т.е., формально является примером валидного C кода, очевидно, что C гарантированно может быть НЕ медленнее JS в 100% случаев.
При этом в обратную сторону гарантии не работают, т.к. JS- это, собственно, API к C, т.е. некоторое подмножество возможных реализаций. Т.е. JS гарантированно НЕ сможет быть производительней C во всех случаях.
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

61. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Аноним (??) on 18-Май-18, 15:36 
> Потому что есть такая штука: формальная (она же "математическая") логика...

Есть, есть. Но каким она боком к вашим умозаключениям - непонятно.

> Учитывая то, что сам JS вполне себе написан на C, т.е., формально является примером валидного C кода, очевидно, что C гарантированно может быть НЕ медленнее JS в 100% случаев.

Во-первых, реализация движков разная. V8 вроде как на плюсах.
Во-вторых … хоспади, какой бред *facepalm.jpg*
С такой "аргументацией" достаточно написать интерпретатор Си на JS. Получим "гарантию", что JS может быть не медленнее сишки в 100% случаев.
Хотя вообще-то нас интересует быстрота выполнения генерируемого из ЯП X кода и там язык написания компилятора/JIT имеет куда меньше влияния, чем сам ЯП, из которого генерируют этот самый код. Динамическая типизация, виртуальные методы, излишниий ООизм, GC и проч.

Ответить | Правка | ^ к родителю #52 | Наверх | Cообщить модератору

54. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от rshadow (ok) on 18-Май-18, 11:31 
И кто только ведется на такой толстый троллинг...
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

5. "isomorphic-git, реализация Git на JavaScript"  +2 +/
Сообщение от Лайка Ваймуле (ok) on 17-Май-18, 11:55 
Это у бородатых фронтендщиков уже спорт такой, типа как Дум на тостере запилить. Ждём появления компиляторов ЦеПлюс на жабаскрипте (если не появились еще).
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

26. "isomorphic-git, реализация Git на JavaScript"  +2 +/
Сообщение от z (??) on 17-Май-18, 17:05 
https://felixhao28.github.io/JSCPP же
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

36. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от Вареник on 17-Май-18, 21:26 
> https://felixhao28.github.io/JSCPP же

JS головного мозга...

Ответить | Правка | ^ к родителю #26 | Наверх | Cообщить модератору

63. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от nongnomer on 18-Май-18, 17:30 
просто no-life man
Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

39. "isomorphic-git, реализация Git на JavaScript"  +3 +/
Сообщение от Crazy Alex (ok) on 17-Май-18, 21:31 
Проблема в том, что они эти тостеры потом в реальные приложения тащат... А дальше - электроны всякие вылезают.
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

10. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от _Vitaly_ (ok) on 17-Май-18, 12:42 
Был же https://github.com/creationix/js-git, на который забили из-за сетевых ограничений а браузере.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

15. "isomorphic-git, реализация Git на JavaScript"  +4 +/
Сообщение от Аноним (??) on 17-Май-18, 13:36 
Нет.
Пожалуйста.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

18. "isomorphic-git, реализация Git на JavaScript"  +3 +/
Сообщение от Аноним (??) on 17-Май-18, 13:52 
Не хватает интеграции с Electron
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

19. "isomorphic-git, реализация Git на JavaScript"  +2 +/
Сообщение от Joekr on 17-Май-18, 13:52 
Еще одно подтверждение закона Джеффа Этвуда - "Any application that can be written in JavaScript, will eventually be written in JavaScript".
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

20. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Аноним (??) on 17-Май-18, 14:57 
Но зачем? WebAssemly решает проблемы при нулевых затратах времени!!!!
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

21. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Диносуслик on 17-Май-18, 15:19 
Видимо писать начинали тогда, когда про васм еще не слышали ничего
Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

34. "isomorphic-git, реализация Git на JavaScript"  +1 +/
Сообщение от Вареник on 17-Май-18, 21:19 
> писать начинали тогда, когда

А дописывали зачем?

Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

59. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от КО on 18-Май-18, 12:54 
Но как? WA это же кастрат - он не умеет пакеты по сети и файлы. Нет, ну хэш на нем посчитаешь, а все остальное на JS.
Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

35. "isomorphic-git, реализация Git на JavaScript"  –2 +/
Сообщение от Вареник on 17-Май-18, 21:24 
> реализация Git на языке JavaScript, нацеленная на предоставление

Надо еще переписать на хРусте, на Скале, на голанге, на Лиспе, Эрлагне и Хаскелле, потом на Руби, Перле и Пыхе. Фанатиков обижать нельзя!

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

48. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от Аноним (??) on 18-Май-18, 03:05 
Я не совсем в теме, простите за возможно глупый вопрос - значит через JS уже можно обращаться к локальной файловой системе клиента? Или это таки делает Электрон, а JS как и прежде только прокладка между клиентом и API?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

57. "isomorphic-git, реализация Git на JavaScript"  –1 +/
Сообщение от Аноним (??) on 18-Май-18, 12:17 
Зависит от API среды выполнения. Обычные десктопные браузеры дают API для работы с внутренним хранилищем сайта с определенной квотой на дисковое место. За пределы хранилища вылезти не могут. Другие среды дают другие возможности, та же Node - полный доступ к ФС.
Ответить | Правка | ^ к родителю #48 | Наверх | Cообщить модератору

64. "isomorphic-git, реализация Git на JavaScript"  +/
Сообщение от .. on 19-Май-18, 02:41 
господа жабаскриптизёры!
вот у питона есть pypy (питон написанный на питоне)
а на когда jsjs ? слабО?

(надеюсь это их займёт на пару лет и мы перестанем видеть новости типа:
"очередной хипстер-н0ркоман написал очередную ненужную хрень на жабаскрипте")

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема


  Закладки на сайте
  Проследить за страницей
Created 1996-2018 by Maxim Chirkov  
ДобавитьПоддержатьВебмастеруГИД  
Hosting by Ihor