• 开源镜像
  • 开源沙龙
  • 媛宝
  • 猿帅
  • 注册
  • 登录
  • 息壤开源生活方式平台
  • 加入我们

开源日报

  • 开源日报第826期:《添加字幕 obs-auto-subtitle》

    7 7 月, 2020
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《添加字幕 obs-auto-subtitle》
    今日推荐英文原文:《Bored With Life? Here Are Two Ways to Make It More Fun》

    今日推荐开源项目:《添加字幕 obs-auto-subtitle》传送门:GitHub链接
    推荐理由:该项目为 OBS 实时字幕插件,能够一边讲话一边自动生成字幕。目前仅支持普通话。
    OBS(Open Broadcaster Software)是一个免费开源的视频录制和视频实时流软件,被广泛使用在视频采集,直播等领域。官网:https://obsproject.com/
    今日推荐英文原文:《Bored With Life? Here Are Two Ways to Make It More Fun》作者:Itxy Lopez
    原文链接:https://medium.com/mind-cafe/bored-with-life-here-are-two-ways-to-make-it-more-fun-c9edadd87558
    推荐理由:“我们不会因为变老而停止玩耍;我们会因为停止玩耍而变老。”

    Bored With Life? Here Are Two Ways to Make It More Fun

    Easy ways to feel a little freer.

    (Photo by Soundtrap on Unsplash)
    We take life too seriously. We’re strict about work schedules, habits, and chasing our dreams. This is a good thing, but eventually, you reach a point when too much of a good thing turns sour.

    By acting overwhelmingly strict about life, there’s no space for freedom, spontaneity, or play — all of which are necessary to keep your life from becoming repetitive and boring.

    This is when we end up in slumps, tired of life, and why artists end up creatively blocked. If your life doesn’t change, even a little, it sucks the joy out of living. You go from a balloon floating in the sky to a flat blob on the ground.

    But that doesn’t have to be true. Anyone, even the most strict and controlling, can learn to let go. You don’t need to go out and explore. You can take two simple steps.

    Tap Into the Power of Music

    (Photo by Lee Campbell on Unsplash) Music is strange. It helps you concentrate and grounds you in the moment, but it also transports you and makes you feel like you’re flying — even if only for three or four minutes.

    Psychology Today shared,

    “When we satisfy our desire to eat, sleep, or reproduce, our brain releases dopamine — the “feel-good” neurochemical involved when we experience pleasure and reward. Turns out this same chemical is released when listening to music.”
    We’re especially restrictive when it comes to working and being productive. Most of us don’t listen to upbeat music we know the lyrics to when we work because it can be distracting, but distraction, while you work, is the key to breaking the routines that have sucked the fun out of life.

    Being productive is important, but who said productivity had to be boring? You’re allowed to have fun while you work. It’s not supposed to suck the life out of you. That’s where the power of music comes in.

    I’m not recommending that you listen to music every time, especially if you’re on a deadline, but this could make life a little more enjoyable.

    The other day, while I was editing an article, I shuffled my ‘liked’ songs and let myself get distracted, but not by social media or anything on the laptop. I let myself pause and dance, I’d sing the choruses to my favorite songs, and you know what I felt? Happy. It was great to let go of all the rules and let myself be in the moment while working.

    It took me a long time to finish my work, but I didn’t care. What mattered was that I was having fun. People don’t listen to music when they work because it distracts them. For once, for just a couple of hours, that’s the point.

    Be Unapologetically Curious Like a Child

    (Photo by Nathan Dumlao on Unsplash)
    My two-year-old cousin, like all toddlers, is endlessly curious about the world. She likes pressing buttons, opening, and closing items, and turning dials to see what happens.

    The other day she opened a wallet and said, “Wow,” when she saw all the compartments and contents inside, which she proceeded to go through. All I could think about was how less curious people become as we grow — as if we knew everything about the world.

    The truth is, there’s still so much that can surprise us. So much that can make us say, “Wow.”

    We should all act like children and allow ourselves to be curious. Whichever buttons you want to press and doors you want to open, do it.

    The beautiful thing about life is that there is an endless array of things to learn. There will always be something you don’t know about, and thanks to the Internet, learning is only a couple of taps away.

    According to the Greater Good Magazine,

    “Research has shown curiosity to be associated with higher levels of positive emotions, lower levels of anxiety, more satisfaction with life, and greater psychological well-being.”
    A couple of years ago, my siblings and I decided we wanted to memorize the name and shape of every country in the world. So, we did. Some people might call that a waste of time — it’s not like it helped me advance in my career. But we were curious, and it turned out to be a fun exercise.

    This is how you need to approach curiosity. You don’t need an excuse to learn something new. You don’t need to figure out how it’ll help reach your goals or how you can monetize it. You can learn about anything just because you can and want to.

    By expanding your knowledge, you start thinking about new things, which can enhance your life, your work, and your creativity. It might not help your career, but it’ll make life more exciting — which if you’re reading this article, is exactly what you want.

    Life doesn’t need to be a series of seriousness. Not everything has to be the end of the world. Life can be careless and fun and loose. Your curiosity and creativity don’t need to die once you grow up — that’s when you should be using it the most.

    We don’t stop playing because we grow old; we grow old because we stop playing. — George Bernard Shaw
    I’m not telling you to abandon all of your rules and to act without being aware of the consequences. I’m saying you’re allowed to play and question everything around you. It’s up to you to become that balloon in the sky again.


    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
  • 开源日报第825期:《EasyOCR》

    6 7 月, 2020
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《EasyOCR》
    今日推荐英文原文:《Not even the coronavirus can derail 5G’s global momentum》

    今日推荐开源项目:《EasyOCR》传送门:项目链接
    推荐理由:安装简单,轻松小巧,即装即用,支持多平台,开源免费,支持40多种语言的完全用python实现的OCR软件.
    今日推荐英文原文:《Not even the coronavirus can derail 5G’s global momentum》作者:Shara Tibken 
    原文链接:https://www.cnet.com/news/not-even-the-coronavirus-can-derail-5gs-global-momentum/
    推荐理由:今年本该是5G技术取得普及的一年,各个手机制造商都开始提供各式各样的5G手机,然而新冠病毒爆发了,尽管如此,超高速无线通讯技术仍在快速地发展.

    Not even the coronavirus can derail 5G’s global momentum

    This was supposed to be the year 5G went mainstream. Huge swaths of the world would be blanketed with coverage. Every major handset maker — including Apple — would offer a wide variety of 5G phones. After years of hype and last year’s early deployments, consumers would finally start to enjoy the benefits of the super-fast wireless technology in a real way.

    The virus, which causes a pneumonia-like disease called COVID-19, quickly spread across the globe, causing cities and entire countries to issue lockdowns to slow its advance. China, where COVID-19 was first detected in late 2019, shut down first, jamming up production of iPhones and other products. The rest of the world soon followed suit, and the global economy all but ground to a halt.

    “In our lifetimes we’ve never seen a faster economic collapse,” Strategy Analytics analyst Ken Hyers said.

    The result is a shattering of the buoyant optimism of just six months ago. Millions of people are out of work, and the world has recorded over 10 million COVID-19 infections. But even if the coronavirus has slowed down the rollout of 5G in heavily hit areas such as the US, it’s not going to stop 5G’s progress.

    The continued advance of 5G is more critical than ever now that the coronavirus has radically changed our world. People are stuck at home and are maintaining their distance from each other, forcing them to rely on home broadband service — something 5G could amp up. The next-generation cellular technology, which boasts anywhere from 10 to 100 times the speed of 4G and rapid-fire responsiveness, could improve everything from simple video conferencing to telemedicine and advanced augmented and virtual reality.

    “The potential resilience and broad connectivity that [5G] offers … [means] people are really going to say, ‘Yeah, I probably need that,’” said David Harold, chief marketing officer at graphics chip tech designer Imagination Technologies. And they need 5G not just to download videos faster but to stay connected to their loved ones and colleagues. Applications enabled by 5G “suddenly feel like urgent tech,” Harold said.

    The demands have gotten every network carrier and handset designer around the globe to focus on the technology, and despite everything, The rollout of 5G has advanced faster than that of 4G LTE in its early days. Even with the pandemic, most, if not all, of the pieces will be in place for 5G to go mainstream this year. Network coverage should be broad, and companies will offer 5G phones aplenty. The only true wild card is whether anyone will buy them — and just how much they’ll cost.

    Early days

    Even as headlines emerged from Wuhan, China, about the novel coronavirus, life went on as usual with CES in Las Vegas in January and Samsung’s Galaxy S20 launch in early February. But the tone began to change after the cancellation of conferences such as Mobile World Congress later in February. The show was scrapped the day after Samsung’s Unpacked event — and just a week before journalists were supposed to descend into Barcelona, Spain.

    MWC, the world’s biggest mobile conference, was the place where 5G was supposed to really break out. This year’s show was slated to feature new 5G phones from nearly every major Android vendor, as well as updates about the networks further embracing the technology.

    The impact on 5G of losing MWC is incalculable. This is where network carriers and phone makers strike up deals. The world’s first Android phone, the T-Mobile G1 from a decade ago, came about partly because of a dinner held at MWC. The next marquee 5G device could have emerged from a chat over tapas.

    Five days after MWC’s cancellation, Apple issued a rare warning, saying the coronavirus was taking a bigger toll on its operations than it thought. At the time, it was being hurt by a shutdown in China, one of its key markets and the location where most of its devices are made. “Worldwide iPhone supply will be temporarily constrained,” Apple said at the time.

    The coronavirus has impacted other companies, as well. Samsung in late April warned that the pandemic would “significantly” hurt its various businesses and cautioned that “5G network investments may face reductions or delays” in Korea and around the globe. COVID-19 ravaged the world at the same time Samsung introduced its most important device of the year, the Galaxy S20.

    All of that culminated in the smartphone industry seeing its biggest ever drop in shipments in February, down 38% to 61.8 million units, according to Strategy Analytics. The firm attributed the “huge” drop to a collapse in demand in Asia.

    Even though the lockdowns expanded across Europe and North America, nothing was quite as bad as the time China was offline.

    Yet its recovery has been just as rapid as its shutdown.

    China’s recovery

    Despite all the noise about 5G here, the epicenter of investment in the next-generation technology is actually in China.

    While China suffered from the coronavirus first, most areas of the country have now largely recovered. Citizens have been returning to work and heading to stores and restaurants. Increasingly, 5G is becoming one of the must-haves for Chinese shoppers, and researchers have found that even with uncertainty in the world, people in China are still buying smartphones and carriers are building out their networks.

    “China is really in full deployment,” said Joy Tan, Huawei’s senior vice president of public affairs. “Most of the cities are back to normal.”

    Ericsson, the Swedish networking giant, expects 5G to be in about twice as many hands in 2020 as it had predicted late last year. The total number of subscribers should reach 190 million this year, with the bulk coming from China. Conversely, North America and Europe won’t be quite as strong as the company previously projected.

    “It’s driven very much by China,” said Patrick Cerwall, head of strategic marketing insights at Ericsson. The country has worked hard on “having devices in shops and making sure that people are then upgrading with good packages.”

    Still, Ericsson expects the areas outside China to recover and be on pace with the company’s earlier predictions by the end of 2025. While the percentage of China’s population using 5G will be higher initially, North America will catch up in a year or two, Cerwall said. At that point, about 20% of people in North America will subscribe to 5G services. That jumps to 75% by the end of 2025.

    This all assumes 5G will actually get rolled out.

    Building the 5G foundation

    5G uptake relies on two things: network availability and handsets. When it comes to the network side, COVID-19 hasn’t hurt the rollout.

    All of the carriers in the US continue to turn on 5G service in more markets, as do providers in China and other regions. It’s Europe and Canada where things are more uncertain.

    Major Canadian and European carriers have launched 5G, but the pandemic has raised questions about how fast their networks can expand. 5G spectrum auctions have been delayed in Canada and parts of the European Union because of the pandemic, pushing out the launch of 5G in some areas by several months or longer. The spectrum auction for Canada was slated for December but will now be held next summer, according to the CBC. Then the novel coronavirus struck.
    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
  • 开源日报第824期:《看个大新闻 pygooglenews》

    5 7 月, 2020
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《看个大新闻 pygooglenews》
    今日推荐英文原文:《An Introduction to Atomic CSS》

    今日推荐开源项目:《看个大新闻 pygooglenews》传送门:项目链接
    推荐理由:这个项目使用 python 对 Google News RSS 进行加工,使得用户可以轻松在 python 上获得它提供的信息,包括热门新闻和各种主题等等,它还提供了多样的搜索功能,诸如标题搜索,网址搜索,日期区间搜索等,不仅是可以在自己的 python 应用上获得新闻信息,用于搜集机器学习需要的数据也是一个不错的选择。
    今日推荐英文原文:《An Introduction to Atomic CSS》作者:Joan Saum
    原文链接:https://medium.com/better-programming/an-introduction-to-atomic-css-880cb02ad57f
    推荐理由:使用一种在长远来说会提供便利的方式来使用 CSS

    An Introduction to Atomic CSS

    Let’s explore Atomic CSS and how you can apply it to your project today

    In the past few years, Atomic CSS, also known as Functional CSS, has gained in popularity but its concept is not clear to everybody. Let’s try to explain it.

    Atomic refers to the atom, the smallest thing possible. The definition of Atomic CSS is:
    Atomic CSS is the approach to CSS architecture that favors small, single-purpose classes with names based on visual function.

    Applying Atomic CSS in Practice

    Atomic CSS is really easy to use.

    Basically, it’s about defining classes with only one attribute inside, as shown below:

    An example of Atomic CSS

    You can see how easy it is to name these class names depending on the attributes it contains.

    Generate Atomic CSS

    There are many tools which automatically generate CSS styles based on class names defined in the HTML files. For example, if you typed this:

    The following CSS is automatically generated:

    CSS generated by a build tool.

    A Style For Everyone

    As in everything, the style code is different for everyone. Some people will prefer shorthand style while others will prefer more readable class names in longhand style.

    Atomic CSS using shorthand and longhand style.

    Immutable CSS

    An important rule when using Atomic CSS is to never modify the value of the attribute of the class name. Otherwise, you could end up with CSS like this:

    An example of bad Atomic CSS

    If you need a new style, you have to create the CSS for it and change the class name in the html part.

    Scalability

    You might first think that using Atomic CSS would make you write more CSS than the classic way. This is true — but only in the beginning.

    Yes, you have to create a lot of class names for every color you use, every margin, padding, height, and so on. But then you don’t have to add a lot of it anymore. Every feature you add doesn’t generate lots of CSS, since you already have all your class names written.

    The size of generated CSS will follow an algorithmic curve like this:

    In flash green, the size of the CSS with the “classic” way. In dark green, the size of ## the CSS with Atomic CSS

    Facebook released a new version (you can see the dedicated article here) where they used Atomic CSS. They reduced the CSS on the homepage by 80% while it now supports dark mode and dynamic font size for accessibility.

    How is Atomic CSS Helpful?

    Let’s summarize how Atomic CSS is helpful.

    Atomic CSS offers an obvious and simple methodology on how to organize your CSS. Classes are immutable, which means your CSS is predictable — you can add or remove CSS as you want without worrying about breaking anything.

    On top of that, the name of your classes is now meaningful — you don’t need to perform any mental exercises to find them. You can read your html files without having to look at your css files to understand the style used.

    No more unused CSS, no more CSS with important! to override a property which has priority and, in the end, you have less CSS than the classic way.

    How Is Atomic CSS Different From Inline Styles?

    Inline styles have been bad practice for a long time and Atomic CSS seems similar.

    In fact, Atomic CSS and inline style do have a major pain point in common. For example, if you want to change the foundation color from green to orange, you can’t just edit your CSS file. You have to change every class in all your HTML files.

    It is good to note that making these changes is not as painful any more, thanks to our convenient IDEs. And, despite this pain point, Atomic CSS offers something a lot better than Inline style…

    Atomic CSS Allows Abstraction

    Atomic CSS allows abstraction to make small changes that would be impossible using inline style.

    An example of HTML with inline style and Atomic CSS

    The first example is using inline style, the second bad Atomic CSS, and the third good Atomic CSS.

    In this case, if we want to change the value of the dark color in our whole application, we can just change the CSS which is contained in the class name color-dark .

    Brevity

    Using inline style can make a long line of code whereas Atomic CSS can use abbreviations according to your style of code.

    CSS Features

    Atomic CSS uses pure CSS, this means it can use every feature designed for CSS such as media queries, pseudo selectors, CSS animations, and so on.

    Want a classname depending on the size of the screen? Just add a prefix:

    An example of Atomic CSS with media queries

    When to Use Atomic CSS

    This question applies to every concept and methodology it can apply to. Everything depends on your project’s needs. The good news is Atomic CSS is not an “all or nothing” feature. You can decide to apply it only in some parts of a project.

    If there is a lot of style inside some media queries, it may be difficult to use Atomic CSS. The decision always depends on your situation.

    I want to finish with a quote from Phil Karlton:
    There are only two hard things in Computer Science: cache invalidation and naming things
    Let’s just say Atomic CSS solves one of the two harder things in computer science.
    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
  • 开源日报第823期:《群聊软件 Zulip》

    4 7 月, 2020
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《群聊软件 Zulip》
    今日推荐英文原文:《How to Improve Your Code Reviews》

    今日推荐开源项目:《群聊软件 Zulip》传送门:GitHub链接
    推荐理由:Zulip 是一款功能强大的开源开源群聊软件,它由 Python 编写,结合了实时聊天的即时性和线程对话的生产力优势,被很多大型公司以及其他需要实时聊天系统的用户使用,也是规模最大,发展最快的开源群聊项目之一。
    今日推荐英文原文:《How to Improve Your Code Reviews》作者:Patrick Kalkman
    原文链接:https://medium.com/better-programming/how-to-improve-your-code-reviews-f5e9d5a6536c
    推荐理由:从刚上大学起,老师就一直强调代码是给其他人看的。对于原作者来说,改动希望尽可能小但又有效;而对与评论者来说,需要做的是帮助改进而不是苛求完美。

    How to Improve Your Code Reviews

    Feedback can be difficult. Here’s a recipe for your pull requests

    Almost twenty years ago, I started as a developer in a company that used code reviews. At that time, I had never done a code review nor was my code ever reviewed.

    For my first project, I had to create a COM component in C++ using the ATL framework. ATL uses reference counting to manage the lifetime of an object. Reference counting means that you have to call Release() when you are done using the object. If you forget to call it, it results in a memory leak.

    I remember the result of my first code review as if it was yesterday. It was dramatic.

    I don’t remember the exact number, but I am sure there were more than 100 review comments. The reviewer mentioned every Release() I forgot. The tone of the review was harsh. I struggled with it.

    Was I such a terrible developer?

    Currently, I have been doing code reviews for more than a decade. Performing code reviews is the best method to improve the quality of your codebase and create a culture of learning and respect.

    Yet there is a specific recipe for successful code reviews.

    Why Are Code Reviews Critical?

    Open the last book you read about programming or another technical topic and look for a paragraph titled Acknowledgments at the beginning of the book.

    I am sure that in this paragraph, the author thanks his editor for helping to create a better version of the book. Editing and reviewing is the standard procedure when writing a book.

    Why isn’t this the same for software development?

    During a code review, another developer checks your work for errors. The developer will point out improvements, such as:
    • hard-to-understand code
    • unclear names
    • commented code
    • untested code
    Besides looking for improvement, the reviewer learns from the solution. You should look at code reviews as an opportunity to grow, and as a safety net — not an opportunity for criticism.

    Code reviews are also known to prevent bugs. Research done by IBM² found that each hour of inspection prevented about 100 hours of related work (testing and defect correction).

    Automate What Can Be Automated

    Before we go on and look at my recipe for successful code reviews, we have to talk about automation.

    Don’t waste time during code reviews checking for style errors. Instead, agree on a style guide and use a linter or a static analysis tool to verify that style.

    Also, make sure that it’s possible to run a complete build to verify that everything still builds correctly and all the unit tests succeed.

    Automating all these tasks will make the contribution from a reviewer more valuable. The reviewer can focus more on other aspects, such as functional errors and readability.

    Recipe for Code Reviews

    My recipe for successful code review consists of two sets of ingredients, one for the author of the changes and another set for the reviewer.

    (Ingredients for a recipe by Jasmin Sessler)

    Ingredients for the Author

    As the author of the changes, you have the responsibility to make it easy for the reviewer to understand your code review.

    The size of the changeset should be small

    Nobody likes doing code reviews that consist of thousands of lines of code changes. It will take much time, and there is a high chance that a re-review is necessary due to a large number of changes. Research¹ has shown that the size of the changeset influences the usefulness of comments. As the changeset gets bigger, the number of useful comments drops.

    So make sure that the size of your changeset is small, say, less than 250 lines. The review will be of a higher quality.

    Proofread your diff

    I can’t tell you how many times I found simple mistakes by proofreading my pull requests. Most tools such as GitHub, Bitbucket, or Azure DevOps contain tools to proofread your diff before sending your pull request.

    As an author, you should always proofread your code changes to find common mistakes so that the reviewer can focus on other points.

    Ingredients for the Reviewer

    Aim for improvement, not for perfection

    Try to improve the code a notch instead of making it perfect. It helps me to think about it in terms of grades. When I receive a pull request that starts at a D, I help the author to bring it to a C — not perfect but better than it was.

    Won’t this degrade the entire codebase to a C? I don’t think so. I find that when I help a developer go from a D to a C, the next pull request they send will start at a C. Within a couple of pull requests, they’re sending me reviews that begin as Bs, which become As by the end of the review.

    Respect the scope of the review

    Simply, only review the code that was changed. If you see something near the modified code that you feel should be fixed, you can kindly ask the author to fix it. But remember that it is not in the scope of the review.

    If the pull request didn’t change a line, it’s out of scope.

    The tone of the review

    I find the tone of the review one of the most important aspects of a code review. Always try to ask open-ended questions instead of making opinionated statements. Offer other alternatives or possible workarounds. But don’t insist on those alternatives or workarounds.

    If you don’t understand something, assume that you, as a reviewer, are missing something and ask for clarification. Try to use the word consider. For example: “Did you consider refactoring this into a single method?” or “Consider renaming this method for readability.”

    Review in a timely manner

    Try to review the pull request as soon as possible. If you first have to finish your task, let the author know when you will start on the review.

    Use a review checklist

    You should try to create a checklist that can be used as a reference when performing the code review. Take a look at the following categories for inspiration about items to put on your checklist:
    • Robustness
    • Correctness
    • Design
    • Maintainability
    • REST API design
    • Globalization
    • Performance
    • Security
    • Scalability
    • Testability
    Another source for inspiration is ISO 25010, a standard that defines quality characteristics of a software system.

    Conclusion

    I am sure that code reviews, when done correctly, can improve your codebase and create a culture of learning and respect.

    This article describes my definition of a good code review. I listed several ingredients for the author and the reviewer to make sure that you are off to a good start.

    For more information, I suggest reading the following articles by other people and organizations on their code review best practices.
    • Code review from Google Engineering
    • How to Make Good Code Reviews Better by Gergely Orosz
    • Code Review Guidelines for Humans by Philipp Hauer
    • Developer’s Guide to a Better Code Review Process from SmartBear
    • How to Do Code Reviews Like a Human By Michael Lynch
    • Humanizing Peer Reviews by Karl E. Wiegers
    Thanks for reading!

    [1]: Amiangshu Bosu. (May 2015). Characteristics of Useful Code Reviews: An Empirical Study at Microsoft

    [2]: Holland, Dick. (December 1999). “Document Inspection as an Agent of Change,” Software Quality Professional, Vol. 2, №1, pp. 22–33.


    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
←上一页
1 … 52 53 54 55 56 … 262
下一页→

Proudly powered by WordPress