Giter VIP home page Giter VIP logo

Comments (22)

blacksnownight avatar blacksnownight commented on June 12, 2024

補充下:是遊戲內的自動保存,並沒有使用Auxilaryfunction輔助面板的自動保存。

from dsp_mods.

starfi5h avatar starfi5h commented on June 12, 2024
ArgumentException: The output byte buffer is too small to contain the encoded data, encoding 'Unicode (UTF-8)' fallback 'System.Text.EncoderExceptionFallback'.
Parameter name: bytes
System.Text.Encoding.ThrowBytesOverflow()
System.Text.Encoding.ThrowBytesOverflow(EncoderNLS encoder, Boolean nothingEncoded)
System.Text.UTF8Encoding.GetBytes(Char* chars, Int32 charCount, Byte* bytes, Int32 byteCount, EncoderNLS baseEncoder)

遊戲內部是由StationComponent.Export(BinaryWriter)中的w.Write(this.name)觸發的
所以是某個重新命名的物流塔的名字有機率觸發錯誤?

Edit:
問題可能出在這一段
https://github.com/soarqin/DSP_Mods/blob/master/CompressSave/Wrapper/BufferWriter.cs#L295-L312
我忘記我為何那時候要使用Convert了。也許這邊的使用方法有錯誤..

from dsp_mods.

lyxlucky avatar lyxlucky commented on June 12, 2024

我也有这个问题,怎么解决啊

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

我也有这个问题,怎么解决啊

解決不了,除非作者更新,或者換其他的壓縮mod

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024
ArgumentException: The output byte buffer is too small to contain the encoded data, encoding 'Unicode (UTF-8)' fallback 'System.Text.EncoderExceptionFallback'.
Parameter name: bytes
System.Text.Encoding.ThrowBytesOverflow()
System.Text.Encoding.ThrowBytesOverflow(EncoderNLS encoder, Boolean nothingEncoded)
System.Text.UTF8Encoding.GetBytes(Char* chars, Int32 charCount, Byte* bytes, Int32 byteCount, EncoderNLS baseEncoder)

遊戲內部是由StationComponent.Export(BinaryWriter)中的w.Write(this.name)觸發的 所以是某個重新命名的物流塔的名字有機率觸發錯誤?

Edit: 問題可能出在這一段 https://github.com/soarqin/DSP_Mods/blob/master/CompressSave/Wrapper/BufferWriter.cs#L295-L312 我忘記我為何那時候要使用Convert了。也許這邊的使用方法有錯誤..

塔拍多了,所以我不能100%保證我沒有誤觸重新改名物流塔
但(應該)是沒有有改過名的物流塔(改那東西沒啥意義)
且我不確定它的涵蓋範圍,如只限於本星系的話,地中海家這裡沒有改過名的物流塔
然後最近在重弄鋼絲球,發現在戴森球介面時系統自動保存的話紅字錯誤機率會非常高
所以會不會不是改過名的物流塔,而是改過名的恆星?

from dsp_mods.

starfi5h avatar starfi5h commented on June 12, 2024

找到複現錯誤的方法了:

  1. CreateBuffer(WrapperDefines wrapper, int ExBufferSize)時將ExBufferSize設為1024
  2. 在任意一個會儲存字串的成員設為超過1024字元的字串 ex. GameMain.data.gameName = new string('*', 5000);
  3. 改完後保存測試就會出錯

修復方法:
將那段改掉, 改為原生BinaryWriter.Write(string)的寫法, 用SuplusCapacity/encoding.GetMaxByteCount(1)判斷buffer剩餘空間最多還可以讀入多少字元, 將字串分段寫入buffer

public unsafe override void Write(string value)
{
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }
    int byteCount = _encoding.GetByteCount(value);
    Write7BitEncodedInt(byteCount);
    {
        var dstSuplus = (int)SuplusCapacity;
        if (byteCount <= dstSuplus)
        {
            fixed (char* start = value)
            {
                int Wcount = _encoding.GetBytes(start, value.Length, curPos, dstSuplus);
                curPos += Wcount;
                //Console.WriteLine($"Using quick write!");
                return;
            }
        }
    }

    int maxBytePerChar = _encoding.GetMaxByteCount(1);
    for (int index = 0; index < value.Length;)
    {
        int dstSuplus = (int)SuplusCapacity;
        int maxChars = dstSuplus / maxBytePerChar;
        if (maxChars <= 0)
        {
            SwapBuffer();
            continue;
        }
        int charsConsumed = ((value.Length - index) > maxChars) ? maxChars : (value.Length - index);
        fixed (char* start = value)
        {
            int Wcount = _encoding.GetBytes(checked(start + index), charsConsumed, curPos, dstSuplus);
            curPos += Wcount;
            index += charsConsumed;
        }
    }
}

這個是修改過後的dll檔, 解壓縮後覆蓋原本的CompressSave.dll. 可以測試有沒有效果
CompressSave.zip

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

找到複現錯誤的方法了:

  1. CreateBuffer(WrapperDefines wrapper, int ExBufferSize)時將ExBufferSize設為1024
  2. 在任意一個會儲存字串的成員設為超過1024字元的字串 ex. GameMain.data.gameName = new string('*', 5000);
  3. 改完後保存測試就會出錯

修復方法: 將那段改掉, 改為原生BinaryWriter.Write(string)的寫法, 用SuplusCapacity/encoding.GetMaxByteCount(1)判斷buffer剩餘空間最多還可以讀入多少字元, 將字串分段寫入buffer

public unsafe override void Write(string value)
{
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }
    int byteCount = _encoding.GetByteCount(value);
    Write7BitEncodedInt(byteCount);
    {
        var dstSuplus = (int)SuplusCapacity;
        if (byteCount <= dstSuplus)
        {
            fixed (char* start = value)
            {
                int Wcount = _encoding.GetBytes(start, value.Length, curPos, dstSuplus);
                curPos += Wcount;
                //Console.WriteLine($"Using quick write!");
                return;
            }
        }
    }

    int maxBytePerChar = _encoding.GetMaxByteCount(1);
    for (int index = 0; index < value.Length;)
    {
        int dstSuplus = (int)SuplusCapacity;
        int maxChars = dstSuplus / maxBytePerChar;
        if (maxChars <= 0)
        {
            SwapBuffer();
            continue;
        }
        int charsConsumed = ((value.Length - index) > maxChars) ? maxChars : (value.Length - index);
        fixed (char* start = value)
        {
            int Wcount = _encoding.GetBytes(checked(start + index), charsConsumed, curPos, dstSuplus);
            curPos += Wcount;
            index += charsConsumed;
        }
    }
}

這個是修改過後的dll檔, 解壓縮後覆蓋原本的CompressSave.dll. 可以測試有沒有效果 CompressSave.zip

嗯...被chrome攔了,說該網站最近被入侵,不過還是下載下來測試看看
就差不多也要睡了,睡醒再看看有沒有紅字。

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

找到複現錯誤的方法了:

  1. CreateBuffer(WrapperDefines wrapper, int ExBufferSize)時將ExBufferSize設為1024
  2. 在任意一個會儲存字串的成員設為超過1024字元的字串 ex. GameMain.data.gameName = new string('*', 5000);
  3. 改完後保存測試就會出錯

修復方法: 將那段改掉, 改為原生BinaryWriter.Write(string)的寫法, 用SuplusCapacity/encoding.GetMaxByteCount(1)判斷buffer剩餘空間最多還可以讀入多少字元, 將字串分段寫入buffer

public unsafe override void Write(string value)
{
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }
    int byteCount = _encoding.GetByteCount(value);
    Write7BitEncodedInt(byteCount);
    {
        var dstSuplus = (int)SuplusCapacity;
        if (byteCount <= dstSuplus)
        {
            fixed (char* start = value)
            {
                int Wcount = _encoding.GetBytes(start, value.Length, curPos, dstSuplus);
                curPos += Wcount;
                //Console.WriteLine($"Using quick write!");
                return;
            }
        }
    }

    int maxBytePerChar = _encoding.GetMaxByteCount(1);
    for (int index = 0; index < value.Length;)
    {
        int dstSuplus = (int)SuplusCapacity;
        int maxChars = dstSuplus / maxBytePerChar;
        if (maxChars <= 0)
        {
            SwapBuffer();
            continue;
        }
        int charsConsumed = ((value.Length - index) > maxChars) ? maxChars : (value.Length - index);
        fixed (char* start = value)
        {
            int Wcount = _encoding.GetBytes(checked(start + index), charsConsumed, curPos, dstSuplus);
            curPos += Wcount;
            index += charsConsumed;
        }
    }
}

這個是修改過後的dll檔, 解壓縮後覆蓋原本的CompressSave.dll. 可以測試有沒有效果 CompressSave.zip

紅字錯誤
睡醒了,還是一樣紅字(且看內容一模一樣),忘了在遊戲中截圖了,因我存檔巨肥(3GB)windows都會以為我遊戲沒回應。
Edit:
重開遊戲後體感上要出現紅字的時間變長了。
但還是有個極限在,原本可能幾小時就出現紅字,現在可以半天這樣的概念。

from dsp_mods.

starfi5h avatar starfi5h commented on June 12, 2024

嗯..不知為何你機器上運行的仍然是舊的未修復的版本
CompressSave122.zip
這個是將版本號提高至1.2.2的dll版本
如果成功的話應該會在日誌檔(BepInEx\LogOutput.log)觀察到載入的是1.2.2的版本

如果是用r2管理器, 在Settings -> Debugging -> Clean mod cache把快取清除試試看
或著把CompressSave整個移除然後重新安裝再用新的dll覆蓋

再不行的話就等作者回來修吧

Edit:
CompressSave_Tempfix.zip
這個是包裝好的管理器本地mod包, 可以在管理器Settings->Profile->Import local mod, 選擇整個zip包安裝
這樣就不用手動覆蓋dll檔, 到時候更新就把這個本地mod解除安裝就好

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

嗯..不知為何你機器上運行的仍然是舊的未修復的版本 CompressSave122.zip 這個是將版本號提高至1.2.2的dll版本 如果成功的話應該會在日誌檔(BepInEx\LogOutput.log)觀察到載入的是1.2.2的版本

如果是用r2管理器, 在Settings -> Debugging -> Clean mod cache把快取清除試試看 或著把CompressSave整個移除然後重新安裝再用新的dll覆蓋

再不行的話就等作者回來修吧

我是使用Thunderstore Mod Manager,看起來情況有點複雜
因Thunderstore Mod Manager上的CompressSave是1.2.1版本
所即使我把CompressSave解除安裝,並且把配置文件刪除
重新安裝後在第一次進遊戲生成配置文件前先覆蓋dll檔
BepInEx還是會抓取1.2.1版本(因Thunderstore Mod Manager上的CompressSave是1.2.1版本)
就有點舊瓶裝新酒的概念,我完全沒辦法去知道這是否有效。
就只能...掛半天看看吧。
QQ图片20230401215103
Edit:
真棒,查看LogOutput才知道BepInEx的作者沒有把新版本的BepInEx上傳至Thunderstore Mod Manager
我看看如何手動安裝。

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

嗯..不知為何你機器上運行的仍然是舊的未修復的版本 CompressSave122.zip 這個是將版本號提高至1.2.2的dll版本 如果成功的話應該會在日誌檔(BepInEx\LogOutput.log)觀察到載入的是1.2.2的版本

如果是用r2管理器, 在Settings -> Debugging -> Clean mod cache把快取清除試試看 或著把CompressSave整個移除然後重新安裝再用新的dll覆蓋

再不行的話就等作者回來修吧

Edit: CompressSave_Tempfix.zip 這個是包裝好的管理器本地mod包, 可以在管理器Settings->Profile->Import local mod, 選擇整個zip包安裝 這樣就不用手動覆蓋dll檔, 到時候更新就把這個本地mod解除安裝就好

當一個框架支撐所有mod然後那個作者還擺爛的時候,真不是甚麼健康的作法。
花了,不知道,算起來應該4小時了,研究一下到底該怎麼做
把BepInEx手動更新到5.4.21
然後順便去敲碗BepInEx作者更新他dsp.thunderstore.io上的版本
然後對所有mod的manifest.json進行修改
cache有一個,profiles\mod\BepInEx\plugins裡同樣也有一個
"dependencies": [
"xiaoye97-BepInEx-5.4.21"
調不調用到這麼高的版本就不關我的事了
順便還發現DSPModSave現是1.1.4版本,但DSPOptimizations還是調用1.1.3,順便幫他改了
姑且來說現在的logout看起來算是,健康
QQ图片20230402012508

這是在還沒安裝CompressSave前的
但加上CompressSave就會有多一行警告,我不是程序猿,所以不知道具體會有甚麼影響
我對cache裡的dll跟BepInEx\plugins裡的dll都修改了大佬您的新版dll。
QQ图片20230402013918

哦,對 那個1.2.2是我自己改的,大佬您的安裝包version_number還是掛著1.2.1,就,先這樣吧。
累了,且是否會在紅字要一段時間。
Edit:
現在完全不能使用r2mod的Clean mod cache,因BepInEx跟CompressSave不符合網站上的版本,那個垃圾桶一按下去就把它倆全殺了,我花了半小時(還一小時)又從頭再來。

from dsp_mods.

starfi5h avatar starfi5h commented on June 12, 2024

[Warning: HarmonyX] UnpatchAll has been called 這行不該出現的, 這會卸載所有的patch使其他mod都失去作用, 理論上它只在OnDestroy()被呼叫, 我在本地測也沒出現這行
https://github.com/soarqin/DSP_Mods/blob/master/CompressSave/CompressSave.cs#L76
(我比較傾向用harmony.PatchAll()和harmony.UnpatchSelf()就是了, 比較安全)

然後你要自己更新框架版本的話, 建議的做法是開個新的profile, 下載原來的5.4.17框架後, 將5.4.21的內容覆蓋上去. 其餘manifest.json和cache別動, 反正manifest主要的功能是讓管理器處理依賴和版本更新而已。不過再討論下去就偏題了, 還想繼續就在我的CompressSave repo開一個新的issue吧。

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

[Warning: HarmonyX] UnpatchAll has been called 這行不該出現的, 這會卸載所有的patch使其他mod都失去作用, 理論上它只在OnDestroy()被呼叫, 我在本地測也沒出現這行 https://github.com/soarqin/DSP_Mods/blob/master/CompressSave/CompressSave.cs#L76 (我比較傾向用harmony.PatchAll()和harmony.UnpatchSelf()就是了, 比較安全)

然後你要自己更新框架版本的話, 建議的做法是開個新的profile, 下載原來的5.4.17框架後, 將5.4.21的內容覆蓋上去. 其餘manifest.json和cache別動, 反正manifest主要的功能是讓管理器處理依賴和版本更新而已。不過再討論下去就偏題了, 還想繼續就在我的CompressSave repo開一個新的issue吧。

對的,我就是下載原本的5.4.17框架後然後再github下5.4.21的貼上
不過目前,額 我mod都還是正常工作
我懷疑是因上次這行
[Warning: BepInEx] plugin [compressSave 1.2.1] targets a wrong version of BepInEx (5.4.20.0) and might not work until you update
實際compressSave有使用到框架5.4.20,但除非有在github特地下,不然大家的框架都是5.4.17
然後我更新至了5.4.21 它就能正常工作去調用裡的某個功能,導致這個警告出現。

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

[Warning: HarmonyX] UnpatchAll has been called 這行不該出現的, 這會卸載所有的patch使其他mod都失去作用, 理論上它只在OnDestroy()被呼叫, 我在本地測也沒出現這行 https://github.com/soarqin/DSP_Mods/blob/master/CompressSave/CompressSave.cs#L76 (我比較傾向用harmony.PatchAll()和harmony.UnpatchSelf()就是了, 比較安全)

然後你要自己更新框架版本的話, 建議的做法是開個新的profile, 下載原來的5.4.17框架後, 將5.4.21的內容覆蓋上去. 其餘manifest.json和cache別動, 反正manifest主要的功能是讓管理器處理依賴和版本更新而已。不過再討論下去就偏題了, 還想繼續就在我的CompressSave repo開一個新的issue吧。

額,測試了一段時間,沒有紅字,不過剛剛系統自動保存保存完成的瞬間遊戲直接閃退
然後我看了眼LogOutput,當遊戲在運行的時候是不會有那個警告的(所以mod才會能正常工作)
QQ图片20230402084333
但是當遊戲關掉後,就會有那個警告(神奇)
不過時間不夠長,可能掛一晚再看看吧
題外話:我去BepInEx敲碗更新mod管理器上的版本,結果被告知上傳的不是作者或BepInEx維護者上傳的,笑死
這帖子我就不close了,等失蹤人口回來看

from dsp_mods.

soarqin avatar soarqin commented on June 12, 2024

按C# doc:
GetBytes will throw an exception if the output buffer isn't large enough, but Convert will fill as much space as possible and return the chars read and bytes written.
Convert()應該不會因為not enough output space而throw ArgumentException,難道是C# doc寫錯了?

from dsp_mods.

soarqin avatar soarqin commented on June 12, 2024
ArgumentException: The output byte buffer is too small to contain the encoded data, encoding 'Unicode (UTF-8)' fallback 'System.Text.EncoderExceptionFallback'.
Parameter name: bytes
System.Text.Encoding.ThrowBytesOverflow()
System.Text.Encoding.ThrowBytesOverflow(EncoderNLS encoder, Boolean nothingEncoded)
System.Text.UTF8Encoding.GetBytes(Char* chars, Int32 charCount, Byte* bytes, Int32 byteCount, EncoderNLS baseEncoder)

遊戲內部是由StationComponent.Export(BinaryWriter)中的w.Write(this.name)觸發的 所以是某個重新命名的物流塔的名字有機率觸發錯誤?
Edit: 問題可能出在這一段 https://github.com/soarqin/DSP_Mods/blob/master/CompressSave/Wrapper/BufferWriter.cs#L295-L312 我忘記我為何那時候要使用Convert了。也許這邊的使用方法有錯誤..

塔拍多了,所以我不能100%保證我沒有誤觸重新改名物流塔 但(應該)是沒有有改過名的物流塔(改那東西沒啥意義) 且我不確定它的涵蓋範圍,如只限於本星系的話,地中海家這裡沒有改過名的物流塔 然後最近在重弄鋼絲球,發現在戴森球介面時系統自動保存的話紅字錯誤機率會非常高 所以會不會不是改過名的物流塔,而是改過名的恆星?

因為這裡是GetBytes() throw exception,結合我上面給的doc內容,這裡有兩種可能:

  1. Convert() call GetBytes() -> throw
  2. 快速write那邊的GetBytes() -> throw

我正在分析C# lib的源碼看到底是哪裡的問題

from dsp_mods.

soarqin avatar soarqin commented on June 12, 2024

decompile Encoder.Convert()->Encoder.GetBytes()后有驚人發現:

    [SecurityCritical]
    [CLSCompliant(false)]
    [ComVisible(false)]
    public virtual unsafe int GetBytes(
      char* chars,
      int charCount,
      byte* bytes,
      int byteCount,
      bool flush)
    {
      if ((IntPtr) bytes == IntPtr.Zero || (IntPtr) chars == IntPtr.Zero)
        throw new ArgumentNullException((IntPtr) bytes == IntPtr.Zero ? nameof (bytes) : nameof (chars), Environment.GetResourceString("ArgumentNull_Array"));
      char[] chars1 = charCount >= 0 && byteCount >= 0 ? new char[charCount] : throw new ArgumentOutOfRangeException(charCount < 0 ? nameof (charCount) : nameof (byteCount), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
      for (int index = 0; index < charCount; ++index)
        chars1[index] = chars[index];
      byte[] bytes1 = new byte[byteCount];
      int bytes2 = this.GetBytes(chars1, 0, charCount, bytes1, 0, flush);
      if (bytes2 < byteCount)
        byteCount = bytes2;
      for (int index = 0; index < byteCount; ++index)
        bytes[index] = bytes1[index];
      return byteCount;
    }

發現Encoder.Convert() call Encoder.GetBytes()這裡面直接一個new然後copy bytes,那這unsafe code的意義就不大了,因為直接Encoding.GetBytes()也是一個new,這樣反而是(Encoding.GetBytes() new的次數) <= (Encoder.Convert() new的次數),所以我覺得應該直接用Encoding.GetBytes()來解決這個bug。
改寫后的Write()如下:

    public override void Write(string value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        byte[] bytes = _encoding.GetBytes(value);
        Write7BitEncodedInt(bytes.Length);
        Write(bytes);
    }

from dsp_mods.

soarqin avatar soarqin commented on June 12, 2024

CompressSave-fix.zip
@blacksnownight 可以試一下我這個fix,如果沒問題我就去thunderstore傳new release了

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

CompressSave-fix.zip @blacksnownight 可以試一下我這個fix,如果沒問題我就去thunderstore傳new release了

剛睡醒就看到作者回來了,我目前使用starfi5h大佬的修改版dll,掛一覺沒紅字
紅字要點時間,並不是說 額 第一次保存就會紅字(一般都是我睡個覺起來看是否有問題,我睡覺時間差不多10小時吧)
所以我不能100%保證大佬你這個fix版本有沒有問題,要不你跟starfi5h蕉流蕉流

from dsp_mods.

soarqin avatar soarqin commented on June 12, 2024

CompressSave-fix.zip @blacksnownight 可以試一下我這個fix,如果沒問題我就去thunderstore傳new release了

剛睡醒就看到作者回來了,我目前使用starfi5h大佬的修改版dll,掛一覺沒紅字 紅字要點時間,並不是說 額 第一次保存就會紅字 所以我不能100%保證大佬你這個fix版本有沒有問題,要不你跟starfi5h蕉流蕉流

Okay, 另外UnpatchAll也改UnpatchSelf()了,在上面的fix裡了

from dsp_mods.

starfi5h avatar starfi5h commented on June 12, 2024

@soarqin 你改的方法比較好 XD 這樣只要new一次就夠了, 也比較簡潔
我這邊測試沒問題
@blacksnownight 可以在性能測試面板那裏按保存測試來測試壓縮存檔, 如果3次內都沒出錯就ok了

from dsp_mods.

blacksnownight avatar blacksnownight commented on June 12, 2024

CompressSave-fix.zip @blacksnownight 可以試一下我這個fix,如果沒問題我就去thunderstore傳new release了

剛睡醒就看到作者回來了,我目前使用starfi5h大佬的修改版dll,掛一覺沒紅字 紅字要點時間,並不是說 額 第一次保存就會紅字 所以我不能100%保證大佬你這個fix版本有沒有問題,要不你跟starfi5h蕉流蕉流

Okay, 另外UnpatchAll也改UnpatchSelf()了,在上面的fix裡了

回來了,先把LogOutput刪了讓它重新生成
@starfi5h 在各種環境下點了十幾次(包含使用Auxilaryfunction時間加速下時保存測試)
沒有紅字,且LogOutput沒有再出現UnpatchAll警告(即使在遊戲完全關閉下)

from dsp_mods.

Related Issues (5)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.