mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-13 22:30:37 +08:00
Merge remote-tracking branch 'LCTT/master'
This commit is contained in:
commit
e710bad796
@ -0,0 +1,127 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (MjSeven)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11752-1.html)
|
||||
[#]: subject: (An advanced look at Python interfaces using zope.interface)
|
||||
[#]: via: (https://opensource.com/article/19/9/zopeinterface-python-package)
|
||||
[#]: author: (Moshe Zadka https://opensource.com/users/moshezhttps://opensource.com/users/lauren-pritchetthttps://opensource.com/users/sethhttps://opensource.com/users/drmjg)
|
||||
|
||||
借助 zope.interface 深入了解 Python 接口
|
||||
======
|
||||
|
||||
> Zope.interface 可以帮助声明存在哪些接口,是由哪些对象提供的,以及如何查询这些信息。
|
||||
|
||||
![Snake charmer cartoon with a yellow snake and a blue snake][1]
|
||||
|
||||
`zope.interface` 库可以克服 Python 接口设计中的歧义性。让我们来研究一下。
|
||||
|
||||
### 隐式接口不是 Python 之禅
|
||||
|
||||
[Python 之禅][2] 很宽松,但是有点自相矛盾,以至于你可以用它来例证任何东西。让我们来思考其中最著名的原则之一:“显示胜于隐式”。
|
||||
|
||||
传统上,在 Python 中会隐含的一件事是预期的接口。比如函数已经记录了它期望一个“类文件对象”或“序列”。但是什么是类文件对象呢?它支持 `.writelines`吗?`.seek` 呢?什么是一个“序列”?是否支持步进切片,例如 `a[1:10:2]`?
|
||||
|
||||
最初,Python 的答案是所谓的“鸭子类型”,取自短语“如果它像鸭子一样行走,像鸭子一样嘎嘎叫,那么它可能就是鸭子”。换句话说,“试试看”,这可能是你能得到的最具隐式的表达。
|
||||
|
||||
为了使这些内容显式地表达出来,你需要一种方法来表达期望的接口。[Zope][3] Web 框架是最早用 Python 编写的大型系统之一,它迫切需要这些东西来使代码明确呈现出来,例如,期望从“类似用户的对象”获得什么。
|
||||
|
||||
`zope.interface` 由 Zope 开发,但作为单独的 Python 包发布。`Zope.interface` 可以帮助声明存在哪些接口,是由哪些对象提供的,以及如何查询这些信息。
|
||||
|
||||
想象编写一个简单的 2D 游戏,它需要各种东西来支持精灵界面(LCTT 译注:“<ruby>精灵<rt> Sprite</rt></ruby>”是指游戏面板中各个组件)。例如,表示一个边界框,但也要表示对象何时与一个框相交。与一些其他语言不同,在 Python 中,将属性访问作为公共接口一部分是一种常见的做法,而不是实现 getter 和 setter。边界框应该是一个属性,而不是一个方法。
|
||||
|
||||
呈现精灵列表的方法可能类似于:
|
||||
|
||||
```
|
||||
def render_sprites(render_surface, sprites):
|
||||
"""
|
||||
sprites 应该是符合 Sprite 接口的对象列表:
|
||||
* 一个名为 "bounding_box" 的属性,包含了边界框
|
||||
* 一个名为 "intersects" 的方法,它接受一个边界框并返回 True 或 False
|
||||
"""
|
||||
pass # 一些做实际渲染的代码
|
||||
```
|
||||
|
||||
该游戏将具有许多处理精灵的函数。在每个函数中,你都必须在随附文档中指定预期。
|
||||
|
||||
此外,某些函数可能期望使用更复杂的精灵对象,例如具有 Z 序的对象。我们必须跟踪哪些方法需要 Sprite 对象,哪些方法需要 SpriteWithZ 对象。
|
||||
|
||||
如果能够使精灵是显式而直观的,这样方法就可以声明“我需要一个精灵”,并有个严格定义的接口,这不是很好吗?来看看 `zope.interface`。
|
||||
|
||||
```
|
||||
from zope import interface
|
||||
|
||||
class ISprite(interface.Interface):
|
||||
|
||||
bounding_box = interface.Attribute(
|
||||
"边界框"
|
||||
)
|
||||
|
||||
def intersects(box):
|
||||
"它和一个框相交吗?"
|
||||
```
|
||||
|
||||
乍看起来,这段代码有点奇怪。这些方法不包括 `self`,而包含 `self` 是一种常见的做法,并且它有一个**属性**。这是在 `zope.interface` 中声明接口的方法。这看起来很奇怪,因为大多数人不习惯严格声明接口。
|
||||
|
||||
这样做的原因是接口显示了如何调用方法,而不是如何定义方法。因为接口不是超类,所以它们可以用来声明数据属性。
|
||||
|
||||
下面是一个能带有圆形精灵的接口的一个实现:
|
||||
|
||||
```
|
||||
@implementer(ISprite)
|
||||
@attr.s(auto_attribs=True)
|
||||
class CircleSprite:
|
||||
x: float
|
||||
y: float
|
||||
radius: float
|
||||
|
||||
@property
|
||||
def bounding_box(self):
|
||||
return (
|
||||
self.x - self.radius,
|
||||
self.y - self.radius,
|
||||
self.x + self.radius,
|
||||
self.y + self.radius,
|
||||
)
|
||||
|
||||
def intersects(self, box):
|
||||
# 当且仅当至少一个角在圆内时,方框与圆相交
|
||||
top_left, bottom_right = box[:2], box[2:]
|
||||
for choose_x_from (top_left, bottom_right):
|
||||
for choose_y_from (top_left, bottom_right):
|
||||
x = choose_x_from[0]
|
||||
y = choose_y_from[1]
|
||||
if (((x - self.x) ` 2 + (y - self.y) ` 2) <=
|
||||
self.radius ` 2):
|
||||
return True
|
||||
return False
|
||||
```
|
||||
|
||||
这**显式**声明了实现了该接口的 `CircleSprite` 类。它甚至能让我们验证该类是否正确实现了接口:
|
||||
|
||||
```
|
||||
from zope.interface import verify
|
||||
|
||||
def test_implementation():
|
||||
sprite = CircleSprite(x=0, y=0, radius=1)
|
||||
verify.verifyObject(ISprite, sprite)
|
||||
```
|
||||
|
||||
这可以由 pytest、nose 或其他测试框架运行,它将验证创建的精灵是否符合接口。测试通常是局部的:它不会测试仅在文档中提及的内容,甚至不会测试方法是否可以在没有异常的情况下被调用!但是,它会检查是否存在正确的方法和属性。这是对单元测试套件一个很好的补充,至少可以防止简单的拼写错误通过测试。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/zopeinterface-python-package
|
||||
|
||||
作者:[Moshe Zadka][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[MjSeven](https://github.com/MjSeven)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/moshezhttps://opensource.com/users/lauren-pritchetthttps://opensource.com/users/sethhttps://opensource.com/users/drmjg
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/getting_started_with_python.png?itok=MFEKm3gl (Snake charmer cartoon with a yellow snake and a blue snake)
|
||||
[2]: https://en.wikipedia.org/wiki/Zen_of_Python
|
||||
[3]: http://zope.org
|
@ -0,0 +1,85 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (nacyro)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11753-1.html)
|
||||
[#]: subject: (9 cheat sheets and guides to enhance your tech skills)
|
||||
[#]: via: (https://opensource.com/article/20/1/cheat-sheets-guides)
|
||||
[#]: author: (Lauren Pritchett https://opensource.com/users/lauren-pritchett)
|
||||
|
||||
九个提升程序员技术技能的备忘单和指南
|
||||
======
|
||||
|
||||
> 用我们最新的编程备忘单和指南来为新年开局,它适合所有技能水平的人。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202001/05/233115etzm6hv4a3z5yvhg.jpg)
|
||||
|
||||
对刚接触命令行的新程序员来说备忘单是完美的。然而,即便是最有经验的程序员也需要时不时地依靠参考资料。假如你刚好敲不出那个讨厌的快捷键,那么手边有个备忘单就很赞了。这是一份我们可供下载指南的综述,它将助你在 2020 年取得成功。
|
||||
|
||||
### 备忘单
|
||||
|
||||
#### Markdown
|
||||
|
||||
[Markdown][2] 不仅针对程序员,任何人都可以借助它为纯文本文档增添语法和结构。此备忘单提供了使用 CommonMark 规范的 Markdown 基础要点。它还包括 GitHub 和 GitLab 的语法。
|
||||
|
||||
#### Linux 权限和用户
|
||||
|
||||
用这个 Linux 备忘单把[用户管理][3]命令放在手边。快速学习如何增删用户、查看历史以及设置权限。
|
||||
|
||||
#### Bash
|
||||
|
||||
一旦你了解了 [Bash][4],在命令行中就蕴含了无限可能。我们的 Bash 备忘单可以帮助你更有效地使用键盘快捷键。不知不觉间,你就能在睡眠中(字面意义上)运行脚本。
|
||||
|
||||
#### Linux 常用命令
|
||||
|
||||
毫不奇怪,我们的 [Linux 常用命令备忘单][5]是如此受欢迎。这个备忘单包含了开始安装软件和导览文件系统的要点。为自己和你的同事打印出来吧。
|
||||
|
||||
#### 微服务
|
||||
|
||||
似乎每个人都在谈论[微服务][6],而且理由很充分。微服务使应用程序模块化,因此更容易构建和维护。它不再只是这个备忘单上的流行语。在[微服务开源指南][7]中了解重要的术语并学习更多关于微服务的基础知识。
|
||||
|
||||
#### Java
|
||||
|
||||
此备忘单非常适合初级和中级 [Java][8] 程序员。它包括重要的上下文以及处理导入、变量、类等的代码。
|
||||
|
||||
#### pip
|
||||
|
||||
程序员爱用 [pip][9] 命令来帮助安装、管理和使用 Python 软件包。然而,pip 可以做的远不止这些。这个备忘单将教你如何构建 wheels 和 record 包。
|
||||
|
||||
### 指南
|
||||
|
||||
#### 七个不可或缺的 PyPI 库
|
||||
|
||||
[这组 Python 教程][10]将帮助你学习如何更快地编写扩展、格式化代码、自动化测试、确保代码一致性,以及更多使用 PyPI 库的方法。
|
||||
|
||||
#### 开始学习 Kubernetes
|
||||
|
||||
在这份平易近人的[指南][11]中,作者 Scott McCarty 用了一个出人意料的类比来解释 Kubernetes 的价值和上手步骤。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/20/1/cheat-sheets-guides
|
||||
|
||||
作者:[Lauren Pritchett][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[nacyro](https://github.com/nacyro)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/lauren-pritchett
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk (a checklist for a team)
|
||||
[2]: https://opensource.com/downloads/cheat-sheet-markdown
|
||||
[3]: https://opensource.com/downloads/linux-permissions-cheat-sheet
|
||||
[4]: https://opensource.com/downloads/bash-cheat-sheet
|
||||
[5]: https://opensource.com/downloads/linux-common-commands-cheat-sheet
|
||||
[6]: https://opensource.com/downloads/microservices-cheat-sheet
|
||||
[7]: https://opensource.com/article/19/11/microservices-cheat-sheet
|
||||
[8]: https://opensource.com/downloads/java-cheat-sheet
|
||||
[9]: https://opensource.com/downloads/pip-cheat-sheet
|
||||
[10]: https://opensource.com/downloads/7-essential-pypi-libraries
|
||||
[11]: https://opensource.com/downloads/getting-started-kubernetes-ebook
|
||||
[12]: https://opensource.com/users/fatherlinux
|
||||
[13]: https://opensource.com/downloads/cheat-sheets
|
||||
[14]: https://opensource.com/email-newsletter
|
116
sources/talk/20200105 7 Ways NOT to manage your remote team.md
Normal file
116
sources/talk/20200105 7 Ways NOT to manage your remote team.md
Normal file
@ -0,0 +1,116 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: ( )
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: subject: (7 Ways NOT to manage your remote team)
|
||||
[#]: via: (https://opensource.com/article/20/1/ways-not-manage-remote-team)
|
||||
[#]: author: (Matt Shealy https://opensource.com/users/mshealy)
|
||||
|
||||
7 Ways NOT to manage your remote team
|
||||
======
|
||||
Learn to let go and let your team shine with these simple steps.
|
||||
![World locations with red dots with a sun burst background][1]
|
||||
|
||||
Building a remote development team presents unique challenges. Trying to build a cross-functional team, full of various personalities, virtually can lead to communication disasters. Fortunately, through planning, smart hiring, training, and communication, project leaders can build and lead virtual development teams successfully.
|
||||
|
||||
The demand for remote teams continues to grow. The increased demand for software developers and [new communication technology][2] has removed the barriers of geography. Even with these advancements, disparate team members from different backgrounds may find it challenging to learn how to interact with one another.
|
||||
|
||||
It's easy for misunderstandings and miscommunications to occur. It's becoming more and more critical to [rethink collaboration][3] in a work environment growing increasingly more remote. As a result, project leaders must rethink the needs of teams spread out across the globe.
|
||||
|
||||
By avoiding a few key pitfalls, your team can overcome these challenges consistently. If you follow a few time-tested, in-house practices, and some that apply specifically to remote teams, you can manage a range of personalities and complete your build successfully.
|
||||
|
||||
The following are seven practices to avoid when managing a remote team.
|
||||
|
||||
### Don't slack on training
|
||||
|
||||
A variety of different perspectives is the top benefit of working with diverse remote team members. However, it’s essential to understand and acknowledge those differences during training.
|
||||
|
||||
Addressing language differences is only one part of acknowledging team diversity. When recruiting programmers, it would be best if you focus on candidates with an aptitude for working in a multicultural environment and even in a multi-coding language environment.
|
||||
|
||||
Also, don’t make the mistake of thinking that personal characteristics are unimportant because team members aren’t working face-to-face. Team members still have to collaborate, so their personalities must mesh.
|
||||
|
||||
Training isn’t all technical skills. Emotional training can also help a team work well together remotely. Emotional intelligence [training can help coworkers develop skills like empathy and awareness][4] that can make teams work better together. Emotional distance can make it challenging to establish bonds between new trainees and team leaders from the get-go, which can immediately loosen bonds in what could be a strong remote team. Consider what remote team-building training you can do via video or on Slack. Remember that is it important to constantly be proactive in strengthening relationships throughout the life of your team.
|
||||
|
||||
### Don't use an ad hoc communication system
|
||||
|
||||
When working with diverse remote team members, it’s essential that you use straightforward, effective code management and communication software. Ideally, you want the most uncomplicated resources available.
|
||||
|
||||
The process may need to be further simplified for newer team members and freelancers who do not have the time to learn everything about the ins and outs of the organization’s policies.
|
||||
|
||||
Create standard ways to communicate with team members. Maybe all work discussion happens in Slack or one of its [open source alternatives][5], while teams use [project management software][6] to keep work on schedule.
|
||||
|
||||
Having a clear space for each type of conversation will help those who need to focus on work, while also offering an outlet for fun. Team members must use these resources daily, if not hourly. If your solutions are too complicated, learning to navigate the tools will pull focus from design and implementation work.
|
||||
|
||||
### Don't lose sight of the big picture
|
||||
|
||||
Avoid the pitfalls of focusing too closely on daily goals. It is essential you stay focused on the overall project. You should work with team members to establish your goals and milestones, and make sure team members stay on schedule. As the project leader, it’s your job to make sure these key events contribute to deliverable milestones.
|
||||
|
||||
### Don't micromanage your team
|
||||
|
||||
Some project managers, especially those with a coding background, find it difficult to delegate responsibility. It’s natural to gravitate toward solving familiar problems. However, it’s your job to guide the ship, not develop solutions.
|
||||
|
||||
In [a micromanaged environment][7], the project manager tells the programmers what the code is, and exactly how to craft it. However, this management style ultimately leads to employee dissatisfaction.
|
||||
|
||||
Your team should feel free to explore solutions, initiate positive change, and use innovation for exciting new ideas.
|
||||
|
||||
If you don’t give your coders space to innovate and use their creativity, they feel undervalued. If this sentiment persists, your remote staff members are unlikely to produce the best work possible.
|
||||
|
||||
### Use this opportunity to promote diversity
|
||||
|
||||
If you are going to build a remote team, you must understand and acknowledge that [team members will have different backgrounds][8]. This circumstance is especially beneficial. The diverse viewpoints of staff members will enable your team to offer insights that expand beyond that of a centrally located talent pool.
|
||||
|
||||
Also, your diverse remote team will give you access to experience with global trends. Furthermore, your team will be less likely to suffer from the effect of crowd mentality thinking.
|
||||
|
||||
With the freedom to innovate, team members will feel more comfortable offering their input. Together, these benefits will enable your team as a whole to build a product better suited for multiple regions and verticals.
|
||||
|
||||
### Don't forget to keep an eye on costs
|
||||
|
||||
Ballooning costs are a top challenge for development teams. Despite project planning best practices, scope creep is a real problem for even the most experienced teams. There are two underlying factors that need to be addressed if this problem is to be solved.
|
||||
|
||||
The first is the fact that the more analysis that is done throughout the development process, the more complexity arises and is ultimately added to the system. The second factor is the fact that people who have been through system development before know that there won’t ever be a "second phase" of the project. They know that there will only be one shot at the project, so they try and fit everything possible into the initial project phase.
|
||||
|
||||
These two self-reinforcing factors lead to a death spiral of problems. Too much analysis leads to system complexity and loads of features being crammed into the first phase. A lack of trust between IT and business teams inevitably forms because of this. The design requirements become too big and complicated for there to be any chance of staying on schedule or on budget. Inevitably, blame lands with the IT team.
|
||||
|
||||
The answer to this problem is to restrict analysis to only what the business team needs right now. IT should refrain from speculating on what may be needed in the future or asking business team members what they may need down the line.
|
||||
|
||||
These requirements allow IT to build a reliable project plan and overall budget. If your team is looking to outsource the project at least in part, [calculating the app development costs][9] for each individual team or project component can help to keep things on track.
|
||||
|
||||
### Don't think of time zone differences as a barrier
|
||||
|
||||
Do not view time zone differences as a challenge. You can leverage time zones to your advantage and build your team in a way that will keep the project running around the clock.
|
||||
|
||||
What is more important is choosing candidates who work independently. Good remote coders are responsible, organize their time effectively, and communicate well with team members. With an effective communication system, time differences will have no effect on the successful outcome of your team.
|
||||
|
||||
Remote team members benefit significantly from predictable and straightforward engagement. The relatively new remote work environment demands that staff members establish a new standard for clear, concise communication. To promote a collaborative environment, teams must establish norms, such as universal jargon and consensus on communication tools.
|
||||
|
||||
In an environment that thrives on innovation, predictability is an asset when it comes to teamwork. Everyone is different, and innovation is a sought-after commodity in software development. However, in the remote environment, consistent behavior helps team members communicate effectively.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Remote work is quickly becoming the new default for software development. Be sure to avoid these pitfalls to set your teams up for success.
|
||||
|
||||
Do you have any tips to recommend? Please share them in the comments.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/20/1/ways-not-manage-remote-team
|
||||
|
||||
作者:[Matt Shealy][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/mshealy
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/world_remote_teams.png?itok=Wk1yBFv6 (World locations with red dots with a sun burst background)
|
||||
[2]: https://www.chamberofcommerce.com/business-advice/strategies-and-tools-for-remote-team-collaboration
|
||||
[3]: https://hbr.org/2018/02/how-to-collaborate-effectively-if-your-team-is-remote
|
||||
[4]: https://www.skillsoft.com/content-solutions/business-skills-training/emotional-intelligence-training/
|
||||
[5]: https://opensource.com/alternatives/slack
|
||||
[6]: https://opensource.com/business/16/2/top-issue-support-and-bug-tracking-tools
|
||||
[7]: https://blog.trello.com/how-to-stop-micromanaging-your-remote-team
|
||||
[8]: https://opensource.com/article/18/10/think-global-communication-challenges
|
||||
[9]: https://www.appdevelopmentcost.com/#the-definitive-guide-to-understanding-app-development-costs
|
@ -1,3 +1,5 @@
|
||||
Translating by MjSeven
|
||||
|
||||
Advanced use of the less text file viewer in Linux
|
||||
======
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: ( )
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
|
@ -1,122 +0,0 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: subject: (Signal: A Secure, Open Source Messaging App)
|
||||
[#]: via: (https://itsfoss.com/signal-messaging-app/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
Signal: A Secure, Open Source Messaging App
|
||||
======
|
||||
|
||||
**_Brief: Signal is a secure open-source messaging app for smartphones. It also offers a standalone desktop app for Linux, Windows, and macOS_. _Here, we take a look at its features and usability._**
|
||||
|
||||
### Signal is an Excellent Alternative to WhatsApp (and Telegram) for Privacy Concerned People
|
||||
|
||||
![Signal App On Linux][1]
|
||||
|
||||
Signal is an open source application with a keen focus on privacy. It is recommended by privacy advocates like [Edward Snowden][2].
|
||||
|
||||
It may not have as many features as Telegram or WhatsApp – but if you want to enhance your privacy while having a conversation, this is a solid open-source solution.
|
||||
|
||||
You can install it on your smartphone ([iOS][3]/[Android][4]) and it is also available for Linux, Windows, and macOS.
|
||||
|
||||
### Features of Signal Messenger
|
||||
|
||||
**Note:** _Some of the features are specific/exclusive to smartphones. You may not observe all the features mentioned in the desktop app._
|
||||
|
||||
As I already mentioned, this is tailored to enhance your privacy. So, the user experience may not be the “best” you’ve ever seen. But, privacy/security-wise, I think it is a good option to have.
|
||||
|
||||
![Signal Features][5]
|
||||
|
||||
#### Disappearing Messages
|
||||
|
||||
You can set a timer for messages in a conversation – so that it will be automatically deleted as per the timer.
|
||||
|
||||
Essentially, anyone in the conversation can activate this feature. So, you control if the messages should stay in a conversation or disappear.
|
||||
|
||||
#### Use it As Default SMS App
|
||||
|
||||
If you want to utilize an open-source app for all your SMSs, you can simply go to Signal’s app settings and set it as the default for SMS and MMS.
|
||||
|
||||
#### Screen Security
|
||||
|
||||
There’s a neat feature to block screenshots in-app, “Screen Security”.
|
||||
|
||||
If you enable it, you won’t be able to take a screenshot of any conversation in the app. You can find the option to enable or disable it from the app settings.
|
||||
|
||||
It may not be useful to everyone – but you can try it out.
|
||||
|
||||
#### Safety Number
|
||||
|
||||
If you want to verify the security of your encryption with a friend, you can simply tap on the profile and scroll down to find “View Safety Number”.
|
||||
|
||||
You can either scan it to verify or simply take a look at it to mark it verified.
|
||||
|
||||
#### Locked Messages
|
||||
|
||||
If you protect the app with a lock (pin/fingerprint), even if your device has been unlocked, you won’t be able to see the messages on your notifications.
|
||||
|
||||
So, when you get a notification while Signal is locked, you will notice the content of the notification as “**Locked Message**” – which is a plus for privacy-oriented users.
|
||||
|
||||
#### Other Features
|
||||
|
||||
![][6]
|
||||
|
||||
As you would expect in a messaging app – you get a couple of stickers to utilize and you can also create a group if you want.
|
||||
|
||||
However, you won’t have the ability to moderate your group – you can just add members and change the profile picture.
|
||||
|
||||
In addition to this, Signal also supports biometric security for its app.
|
||||
|
||||
### Installing Signal on Ubuntu/Linux
|
||||
|
||||
Unfortunately, you don’t get a .**deb** or .**AppImage** to install it on your Linux distro. So, you will need to utilize the terminal as per the [official installation instructions][7].
|
||||
|
||||
Here’s what you have to type in the terminal:
|
||||
|
||||
```
|
||||
curl -s https://updates.signal.org/desktop/apt/keys.asc | sudo apt-key add -
|
||||
echo "deb [arch=amd64] https://updates.signal.org/desktop/apt xenial main" | sudo tee -a /etc/apt/sources.list.d/signal-xenial.list
|
||||
sudo apt update && sudo apt install signal-desktop
|
||||
```
|
||||
|
||||
Simply copy-paste the commands one by one in the terminal and you should be good to go.
|
||||
|
||||
[Download Signal for Other Devices][7]
|
||||
|
||||
### My Thoughts On Signal
|
||||
|
||||
I’ve been using Signal for a few years now and it has improved with what it offers. However, I still feel that the user experience can be improved.
|
||||
|
||||
Privacy-wise, it is definitely a good alternative to what we already have (in my opinion). You can give it a try and see how well it works for your usage.
|
||||
|
||||
You can also take a look at their [GitHub page][8] for the latest developments and beta releases if you want to try them out.
|
||||
|
||||
Signal app may not be a popular messaging app when compared to WhatsApp or even [Telegram on Linux][9]. But, you can try it for yourself and encourage your friends to use an open-source messaging app.
|
||||
|
||||
Have you tried it yet? Let me know what you think about the ‘Signal’ app in the comments below.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/signal-messaging-app/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/signal-shot.jpg?ssl=1
|
||||
[2]: https://en.wikipedia.org/wiki/Edward_Snowden
|
||||
[3]: https://apps.apple.com/us/app/signal-private-messenger/id874139669
|
||||
[4]: https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&hl=en_IN
|
||||
[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/signal-phone.jpg?ssl=1
|
||||
[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/12/signal-shot-1.jpg?ssl=1
|
||||
[7]: https://signal.org/download/
|
||||
[8]: https://github.com/signalapp
|
||||
[9]: https://itsfoss.com/install-telegram-desktop-linux/
|
@ -1,125 +0,0 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (MjSeven)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: subject: (An advanced look at Python interfaces using zope.interface)
|
||||
[#]: via: (https://opensource.com/article/19/9/zopeinterface-python-package)
|
||||
[#]: author: (Moshe Zadka https://opensource.com/users/moshezhttps://opensource.com/users/lauren-pritchetthttps://opensource.com/users/sethhttps://opensource.com/users/drmjg)
|
||||
|
||||
借助 zope.interface 深入了解 Python 接口
|
||||
======
|
||||
Zope.interface 可以帮助指出存在哪些接口,是由哪些对象提供的,以及如何查询这些信息。
|
||||
![Snake charmer cartoon with a yellow snake and a blue snake][1]
|
||||
|
||||
**zope.interface** 库可以克服 Python 接口设计中的歧义性。让我们来研究一下。
|
||||
|
||||
### 隐式接口不是 Python 之禅
|
||||
|
||||
[Python 之禅][2] 很宽松,但是有点自相矛盾,你可以从中证明一切。让我们来思考其中最著名的原则之一:“显示胜于隐式”。
|
||||
|
||||
在 Python 中会隐含的一件事是预期的接口。比如函数已经记录了它期望一个“类文件对象”或“序列”。但是什么是类文件对象呢?它支持 **.writelines** 和 **.seek** 吗?什么是一个“序列”?是否支持分步切片,例如 **a[1:10:2]**?
|
||||
|
||||
最初,Python 的答案是所谓的“鸭子类型”,取自短语“如果它像鸭子一样行走,像鸭子一样嘎嘎叫,那么它可能就是鸭子”。换句话说,“试试看”,这可能是你能得到的最含蓄的表达。
|
||||
|
||||
为了使这些内容显式地表达出来,你需要一种方法来表达期望的接口。最早用 Python 编写的大型系统之一是 [Zope][3] Web 框架,它迫切需要这些东西来明确地呈现代码,例如,期望从“类似用户的对象”获得什么。
|
||||
|
||||
**zope.interface** 由 Zope 开发,但作为单独的 Python 包发布。**Zope.interface** 可以帮助指出存在哪些接口,是由哪些对象提供的,以及如何查询这些信息。
|
||||
|
||||
想象编写一个简单的 2D 游戏,它需要各种东西来支持 sprite 接口(to 校正:这里不知道如何翻译)。例如,表示一个边界框,但也表示对象何时与一个框相交。与一些其他语言不同,在 Python 中,将属性访问作为公共接口一部分是一种常见的做法,而不是实现 getter 和 setter。边界框应该是一个属性,而不是一个方法。
|
||||
|
||||
呈现外观列表的方法可能类似于:
|
||||
|
||||
```
|
||||
def render_sprites(render_surface, sprites):
|
||||
"""
|
||||
sprites 应该是符合 Sprite 接口的对象列表:
|
||||
* 一个属性 "bounding_box",包含了边界框
|
||||
* "intersects" 方法,它接受一个 box 并返回 True 或 False
|
||||
"""
|
||||
pass # 一些代码会渲染
|
||||
```
|
||||
|
||||
游戏将具有许多处理 sprite 的功能(函数)。在每个功能(函数)中,你都必须在文档中指定预期。
|
||||
|
||||
此外,某些功能可能期望使用更复杂的 Sprite 对象,例如具有 Z-order 的对象。我们必须跟踪哪些方法需要 Sprite 对象,哪些方法需要 SpriteWithZ 对象。
|
||||
|
||||
如果能够使 sprite 的内容显式出来,这样方法就可以声明“我需要一个 sprite”,并严格定义接口,这不是很好吗?来看看 **zope.interface**。
|
||||
|
||||
```
|
||||
from zope import interface
|
||||
|
||||
class ISprite(interface.Interface):
|
||||
|
||||
bounding_box = interface.Attribute(
|
||||
"The bounding box"
|
||||
)
|
||||
|
||||
def intersects(box):
|
||||
"它和一个框相交吗?"
|
||||
```
|
||||
|
||||
乍看起来,这段代码有点奇怪。这些方法不包括 "self",而包含 "self" 是一种常见的做法,并且它有一个属性。这是在 zope.interface 中声明接口的方法。这看起来很奇怪,因为大多数人不习惯严格声明接口。
|
||||
|
||||
这样做的原因是接口显示了如何调用方法,而不是如何定义方法。因为接口不是超类,所以它们可以用来声明数据属性。
|
||||
|
||||
下面是一个可能的接口实现:
|
||||
|
||||
```
|
||||
@implementer(ISprite)
|
||||
@attr.s(auto_attribs=True)
|
||||
class CircleSprite:
|
||||
x: float
|
||||
y: float
|
||||
radius: float
|
||||
|
||||
@property
|
||||
def bounding_box(self):
|
||||
return (
|
||||
self.x - self.radius,
|
||||
self.y - self.radius,
|
||||
self.x + self.radius,
|
||||
self.y + self.radius,
|
||||
)
|
||||
|
||||
def intersects(self, box):
|
||||
# 当且仅当至少一个角在圆内时,方框与圆相交
|
||||
top_left, bottom_right = box[:2], box[2:]
|
||||
for choose_x_from (top_left, bottom_right):
|
||||
for choose_y_from (top_left, bottom_right):
|
||||
x = choose_x_from[0]
|
||||
y = choose_y_from[1]
|
||||
if (((x - self.x) ** 2 + (y - self.y) ** 2) <=
|
||||
self.radius ** 2):
|
||||
return True
|
||||
return False
|
||||
```
|
||||
|
||||
这 _显式_ 声明了 **CircleSprite** 类实现接口。它甚至能让我们验证该类是否正确实现了接口:
|
||||
|
||||
```
|
||||
from zope.interface import verify
|
||||
|
||||
def test_implementation():
|
||||
sprite = CircleSprite(x=0, y=0, radius=1)
|
||||
verify.verifyObject(ISprite, sprite)
|
||||
```
|
||||
|
||||
这可以由 **pytest**、**nose** 或其他测试框架运行,它将验证创建的 sprite 是否符合接口。测试通常是局部的:它不会测试文档中没有提及的内容,甚至不会测试方法是否可以在没有异常的情况下被调用!但是,它会检查是否存在正确的方法和属性。这是对单元测试套件一个很好的补充,至少可以防止简单的拼写错误通过测试。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/zopeinterface-python-package
|
||||
|
||||
作者:[Moshe Zadka][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[MjSeven](https://github.com/MjSeven)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/moshezhttps://opensource.com/users/lauren-pritchetthttps://opensource.com/users/sethhttps://opensource.com/users/drmjg
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/getting_started_with_python.png?itok=MFEKm3gl (Snake charmer cartoon with a yellow snake and a blue snake)
|
||||
[2]: https://en.wikipedia.org/wiki/Zen_of_Python
|
||||
[3]: http://zope.org
|
@ -1,88 +0,0 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (nacyro)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: subject: (9 cheat sheets and guides to enhance your tech skills)
|
||||
[#]: via: (https://opensource.com/article/20/1/cheat-sheets-guides)
|
||||
[#]: author: (Lauren Pritchett https://opensource.com/users/lauren-pritchett)
|
||||
|
||||
九个提升你技术技能的备忘单和指南
|
||||
======
|
||||
用我们最新的编程备忘单和指南来为新年开局,它适合所有技能水平的人。来参加我们的投票,让我们知道你接下来想看什么!
|
||||
|
||||
![a checklist for a team][1]
|
||||
|
||||
对刚接触命令行的新程序员来说备忘单是完美的。然而,即便是最有经验的程序员也需要时不时地依靠参考资料。假如你刚好敲不出那个讨厌的快捷键,那么手边有个备忘单就很赞了。这是一份我们可供下载指南的综述,它将助你在 2020 年取得成功。
|
||||
|
||||
### 备忘单
|
||||
|
||||
#### [Markdown][2]
|
||||
|
||||
Markdown 不仅针对程序员,任何人都可以借助它为纯文本文档增添语法和结构。此备忘单提供了使用 CommonMark 规范的 Markdown 要点。它还包括 GitHub 和 GitLab 的语法。
|
||||
|
||||
#### [Linux 权限和用户][3]
|
||||
|
||||
用这个 Linux 备忘单把用户管理命令放在手边。快速学习如何增删用户、查看历史以及设置权限。
|
||||
|
||||
#### [Bash][4]
|
||||
|
||||
一旦您了解了 Bash,在命令行中就蕴含了无限可能。我们的 Bash 备忘单可以帮助您更有效地使用键盘快捷键。不知不觉间,您就能易如反掌地运行脚本。
|
||||
|
||||
#### [Linux 常用命令][5]
|
||||
|
||||
毫不奇怪,我们的 Linux 常用命令备忘单是如此受欢迎。这个备忘单包含了开始安装软件和导览文件系统的要点。为自己和你的同事打印出来吧。
|
||||
|
||||
#### [微服务][6]
|
||||
|
||||
似乎每个人都在谈论微服务,而且理由很充分。微服务使应用程序模块化,因此更容易构建和维护。它不再只是这个备忘单上的流行语。在 [微服务开源指南][7] 中了解重要的术语并学习更多关于微服务的基础知识。
|
||||
|
||||
#### [Java][8]
|
||||
|
||||
此备忘单非常适合初级和中级 Java 程序员。它包括重要的上下文以及处理导入、变量、类等的代码。
|
||||
|
||||
#### [pip][9]
|
||||
|
||||
程序员爱用 pip 命令来帮助安装、管理和使用 Python 软件包。然而,pip 可以做的远不止这些。这个备忘单将教你如何构建 wheels 和 record 包。
|
||||
|
||||
### 指南
|
||||
|
||||
#### [七个不可或缺的 PyPI 库][10]
|
||||
|
||||
这组 Python 教程将帮助您学习如何更快地编写扩展、格式化代码、自动化测试、确保代码一致性,以及更多使用 PyPI 库的方法。
|
||||
|
||||
#### [开始学习 Kubernetes][11]
|
||||
|
||||
在这份平易近人的指南中,作者 [Scott McCarty][12] 用了一个出人意料的类比来解释 Kubernetes 的价值和上手步骤。
|
||||
|
||||
* * *
|
||||
|
||||
我们想听听你的意见:你对新的备忘单或指南有什么高见?参加我们的投票,从选项中选择一个,或者在评论中告诉我们。点击 [这里][13] 查看我们所有的下载。通过 [注册][14] 我们的电子邮件通讯获得关于新备忘单的提醒。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/20/1/cheat-sheets-guides
|
||||
|
||||
作者:[Lauren Pritchett][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[nacyro](https://github.com/nacyro)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/lauren-pritchett
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk (a checklist for a team)
|
||||
[2]: https://opensource.com/downloads/cheat-sheet-markdown
|
||||
[3]: https://opensource.com/downloads/linux-permissions-cheat-sheet
|
||||
[4]: https://opensource.com/downloads/bash-cheat-sheet
|
||||
[5]: https://opensource.com/downloads/linux-common-commands-cheat-sheet
|
||||
[6]: https://opensource.com/downloads/microservices-cheat-sheet
|
||||
[7]: https://opensource.com/article/19/11/microservices-cheat-sheet
|
||||
[8]: https://opensource.com/downloads/java-cheat-sheet
|
||||
[9]: https://opensource.com/downloads/pip-cheat-sheet
|
||||
[10]: https://opensource.com/downloads/7-essential-pypi-libraries
|
||||
[11]: https://opensource.com/downloads/getting-started-kubernetes-ebook
|
||||
[12]: https://opensource.com/users/fatherlinux
|
||||
[13]: https://opensource.com/downloads/cheat-sheets
|
||||
[14]: https://opensource.com/email-newsletter
|
@ -0,0 +1,122 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: subject: (Signal: A Secure, Open Source Messaging App)
|
||||
[#]: via: (https://itsfoss.com/signal-messaging-app/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
Signal:安全、开源的聊天应用
|
||||
======
|
||||
|
||||
** _简介:Signal 是一款智能手机上的安全开源聊天应用。它还提供了适用于 Linux、Windows 和 macOS 的独立桌面应用。在本文中,我们来看看它的功能和可用性。_**
|
||||
|
||||
### 对于关注隐私的人来说,Signal 是 WhatsApp(和 Telegram)的绝佳替代品
|
||||
|
||||
![Signal App On Linux][1]
|
||||
|
||||
Signal 是一款关注隐私的开源应用。像[爱德华·斯诺登][2]这样的隐私权倡导者建议使用它。
|
||||
|
||||
它可能没有 Telegram 或 WhatsApp 这么多的功能。但是,如果你想在交流时增强隐私,这是一个可靠的开源方案。
|
||||
|
||||
你可以在智能手机(iOS][3]/[Android][4])上安装,也可以在 Linux、Windows 和 macOS 上安装。
|
||||
|
||||
### Signal 的功能
|
||||
|
||||
**注意:** _某些功能是智能手机特有的。你可能无法在桌面应用上看到所有功能。_
|
||||
|
||||
正如我已经提到的,这是为增强你的隐私而量身定制的。因此,用户体验可能不是你见过“最佳”的。但是,从隐私/安全角度考虑,我认为这是一个不错的选择。
|
||||
|
||||
![Signal Features][5]
|
||||
|
||||
#### 消失的消息
|
||||
|
||||
你可以为对话中的消息设置一个计时器,以便根据它自动删除消息。
|
||||
|
||||
本质上,对话中的任何人都可以激活此功能。因此,你可以控制对话中的消息时保留还是消失。
|
||||
|
||||
#### 用作默认短信应用
|
||||
|
||||
如果你想在短信中使用开源应用,那么只需口进入 Signal 的设置,并将其设置为短信和彩信的默认设置。
|
||||
|
||||
#### 屏幕安全
|
||||
|
||||
有一个巧妙的功能可以阻止应用内截图,它就是“屏幕安全”。
|
||||
|
||||
如果你开启它,那么你将无法为应用中的任何对话截图。你可以从应用设置中找到启用或禁用它的选项。
|
||||
|
||||
它可能并不是对所有人有用,但你可以尝试一下。
|
||||
|
||||
#### 安全数字
|
||||
|
||||
如果你想与朋友一起验证加密的安全性,只需点击个人资料并向下滚动找到“查看安全数字”。
|
||||
|
||||
你可以扫描验证或者看一眼并标记为已验证。
|
||||
|
||||
#### 锁定消息
|
||||
|
||||
如果你使用了锁(密码/指纹)来保护应用,那么即使你的设备已解锁,你也无法在通知中看到消息。
|
||||
|
||||
因此,当 Signal 处于锁定状态收到通知时,你会注意到通知的内容为 “**Locked Message**”,这对于注重隐私的用户来说是一个加分项。
|
||||
|
||||
#### 其它功能
|
||||
|
||||
![][6]
|
||||
|
||||
如你所期待的聊天应用,你可以使用几个标签,并且可以根据需要创建一个组。
|
||||
|
||||
但是,你无法管理你的组,你只能添加成员和更改群头像。
|
||||
|
||||
此外,Signal 还为其应用支持生物识别。
|
||||
|
||||
### 在 Ubuntu/Linux 上安装 Signal
|
||||
|
||||
不幸的是,你无法在你的 Linux 发行版上找到 .**deb** 或者 .**AppImage**。因此,你需要根据[官方安装说明][7]在终端上安装。
|
||||
|
||||
在终端中输入以下内容:
|
||||
|
||||
```
|
||||
curl -s https://updates.signal.org/desktop/apt/keys.asc | sudo apt-key add -
|
||||
echo "deb [arch=amd64] https://updates.signal.org/desktop/apt xenial main" | sudo tee -a /etc/apt/sources.list.d/signal-xenial.list
|
||||
sudo apt update && sudo apt install signal-desktop
|
||||
```
|
||||
|
||||
只需在终端中一个接一个地复制并粘贴命令。
|
||||
|
||||
[Download Signal for Other Devices][7]
|
||||
|
||||
### 我对 Signal 的想法
|
||||
|
||||
我已经使用 Signal 有几年了,它的功能已经得到了改善。但是,我仍然认为可以改善用户体验。
|
||||
|
||||
在隐私方面,(在我看来)这绝对是我们已有软件的一个很好的替代方案。你可以尝试一下,看看它的使用效果如何。
|
||||
|
||||
如果你想尝试一下它,也可以看看它的 [GitHub 页面][8]以获取最新的开发和 beta 版本。
|
||||
|
||||
与 WhatsApp 甚至 [Linux 上的 Telegram][9] 相比,Signal 可能不是流行的聊天应用。但是,你可以自己尝试一下,并鼓励你的朋友使用它。
|
||||
|
||||
你尝试过了吗?在下面的评论中,让我知道你对 “Signal” 的看法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/signal-messaging-app/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/signal-shot.jpg?ssl=1
|
||||
[2]: https://en.wikipedia.org/wiki/Edward_Snowden
|
||||
[3]: https://apps.apple.com/us/app/signal-private-messenger/id874139669
|
||||
[4]: https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&hl=en_IN
|
||||
[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/signal-phone.jpg?ssl=1
|
||||
[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/12/signal-shot-1.jpg?ssl=1
|
||||
[7]: https://signal.org/download/
|
||||
[8]: https://github.com/signalapp
|
||||
[9]: https://itsfoss.com/install-telegram-desktop-linux/
|
Loading…
Reference in New Issue
Block a user