ffftp / ffftp Goto Github PK
View Code? Open in Web Editor NEWFTPクライアントソフトウェアです。
License: BSD 2-Clause "Simplified" License
FTPクライアントソフトウェアです。
License: BSD 2-Clause "Simplified" License
#3 の調査で発見。
DefaultHostのパスワードが保存されない。
非PASVモード時にUPnPの制御を試行する
が有効になっているとUPnPが試行されるが、リモートアドレスがPrivate IPの場合、外部アドレスを取得するべきではない。
多段NAT等があるので、条件を精査する必要がある。
cf. https://twitter.com/swingwings/status/1001874169745760256
OpenSSL 1.1.0 から 1.1.1へのアップデート予定や、
TLS1.3やSHA512などの追加サポート予定はありますか?
また少しなにかお手伝い出来れば、させて頂きたいのですが…。
#9 により、不正な証明書に対して警告が表示されるようになったが、警告を抑止するオプションが提供されていないので、アプリケーションを起動し直す度に警告される。
等の案があります。
レジストリ・INIファイルに保存されるパスワードはマスターパスワードを鍵にして暗号化されている。マスターパスワードを設定していない場合は固定文字列が使われるため、実質的には可逆変換であり暗号化ではなくなる。
パスワードをコントロールパネル - 資格情報マネージャーに保存することで、パスワード管理をマスターパスワードに頼らずOSに委ねることができる。
問題点としては可搬性がなくなること。INI保存の場合は引き続きマスターパスワードを使うことになるか。
https://twitter.com/nyankolers/status/1011990112173883392
ffftp v3.4はwin7にインストールしても「sslの初期化に失敗しました。」で起動しない。v3は大丈夫だった。
・該当フォルダにregファイルは存在するが一覧に表示されない
・入力欄に頭の文字を入れると候補は表示される
この候補を選択すると、正常に復元できる
https://github.com/sayurin/ffftp/blob/987378aaeabd0f55183bc20a1c6b6aa2158b359d/remote.cpp#L1426
この辺り。
ファイルアップロード時、従来はConvSJIStoJIS
内で半角カナから全角カナへ変換していた。
内部UTF-8化に伴い、ConvUTF8NtoSJIS
で半角カナから全角カナへ変換を行い、ConvSJIStoJIS
では変換しない実装へ変更された。ところがここで導入されたConvUTF8NtoSJIS
には半角カナから全角カナへの変換機能が実装されていなかった。結果として、半角カナから全角カナへの変換は行われなくなってしまった。
なお、ファイルダウンロード時、ファイル名変換は行っていない。
version3.3です。ホストの設定の暗号化タブで「FTPS(Explicit)で接続」にチェックが入っているとFTP側のファイルが真っ白になります。「暗号化なしで・・・」にチェックを入れると表示される。version3.2では問題なく表示されていた。
Line 236 in cc99cc3
左側はRAS API ANSIバージョンが返したもの、右側は内部データなのでUTF-8化されている。
InitializeSecurityContext
がSEC_E_UNSUPPORTED_FUNCTION
を返す。正常動作か、改善可能か調査する。
#2 で不正な証明書への対応が不十分なことが判明した。
ConfirmSSLCertificate
周り)
そのためにコントロール接続に対して証明書を保持させる。
#38 の派生。そもそもローカルでも10,000ファイルで耐え難い速度。
海外在住者です。
日本のサーバーにアップロードするとある条件下で一時的にサーバー側のファイルのタイムスタンプが1年前になってしまう(1日以内に戻る)という現象が起きています。
たまに二人で作業することもあるためミラーリングは必須なのですが、上記現象ゆえに困っています。何とか解決方法があるならとてもありがたいです。
現在は、アップロードの時間を制限して、00:00~10:59だけにしています。11:00~23:59の間はアップロードしないように気を付けているような状況です。
https://osdn.net/projects/ffftp/forums/27005/39434/ から転載
ある条件下でサーバーにアップロードしたファイルのタイムスタンプがちょうど1年前になってしまいます。日付及び時刻は同じです。ただし、しばらくすると(9時間後?)、正常な年に戻ります。実はこの問題はかなり古いバージョン(10年以上前)にもあって、当時、作者にも問い合わせましたが、結局未解決のままでした。
ところが、昨日、FFFTPでは1年前(2017年)として表示されているのに、Filezillaというソフトで見てみるとちゃんと2018年と表示されているのを発見。つまり、やはり何か方法があるのかもしれないと思い、こちらで聞いてみることにしました。
ちなみに私はいま、ブラジルの GMT -4:00 の地域におります。つまり現在日本とは13時間差があります。こちらが遅れています。左右ペインの日時を合わせるためにホストのタイムゾーンはGMT +9:00 (日本)にしていますが、どういう設定にしてもこの特定条件下での1年ずれ現象に変化はないことは確認済です。
タイムスタンプが1年前になってしまうには条件があるようです。ちょっとややこしいですが説明してみます。
ファイルのタイムスタンプが送信日当日のもので、かつ、こちらの日付と日本(サーバー)の日付が1日ずれているときに上記の1年ズレの現象が起きるようです。日本の日付が変わったとき(つまり現地時間の午前11時)からこの現象が起きることを確認しています。たとえば、2018/04/20 10:59 というタイムスタンプのファイルを 11:01にアップロードすれば、2018/04/20 のままですが、タイムスタンプが 2018/04/20 11:00 のファイルは 2017/04/20 11:00 と表示されるようになります。
そして数時間後に本来の日時2018/04/20 11:01になるということです。この「数時間」が何時間かは未確認ですが、9時間という情報も見ました。なかなかちょうどの時間にPCの前にいられないので明確な時間はまだ分かっていません。
ちなみに、Filezillaでは全部正常に表示されているのですが、サーバー設定の「サーバのタイムゾーン オフセットの調整」はゼロのままです。ここを9時間とすると右ペイン(サーバー側)の時間が9時間プラスになってしまいます。
タイムスタンプが1年前だとミラーリングの時に都合が悪くて困っています。単に表示上だけでなく本当に1年前の日付として判断されてしまうのです。
ディレクトリのリストは一旦ファイルに書き出されていて、それを再度読み直す実装になっている。当該ファイルを残しておく機能としてキャッシュ機能が実装されている。
しかし、FTPにおいてキャッシュ可否をサーバーが返すわけではないため、ランダムで古いデータを参照してしまうだけである。
それよりも、ファイルに書き出さず、オンメモリでディレクトリリストを処理した方がパフォーマンスが向上するはずである。そのため、キャッシュ機能を削除する。
ファイル名の漢字コードの自動推測機能が存在するが、推測処理は接続直後のルートディレクトリでしか実行されておらず、一度確定すると変更されない。
しかし、ルートディレクトリにはデータファイル等が置かれていない可能性が高く、その場合に漢字コードの推測が行えない。
ASCII以外が出現するまで推測処理を保留する必要がある。
UTF-8対応の際、char*
がANSI(日本語ではShift-JIS)からUTF-8に変換された。そのためchar*
を扱う標準ライブラリは一切呼び出すことができなくなった。そのための対策としてmbswrapper.cにてUTF-8 char*
からwchar_t*
に変換を行うラッパー関数を用意し、このラッパー関数が存在するライブラリ関数のみ呼び出し可能となっている。
ライブラリ関数呼び出しにこのような制限が存在すると機能拡張の足かせになるため、内部で保持する文字列をUTF-8 char*
からwchar_t*
に変更する。併せてstd::wstring
への変更も行っていく。
IPv6対応としてSOCKET
を扱う関数が~IPv4
、~IPv6
と2バージョン用意されておりコードが冗長になっている。
SOCKET
を適切に扱うことでこれらの関数を共通化させ、コード分岐を最小限に抑える。
なおDual-Stack SocketsはVista以降なので32bit版には使えず導入しない。64bit版のみ導入する可能性も微レ存。
#32 から派生
MLSDを使うようにすると、ミラーリングダウンロードのリストアップ中にいつも止まってしまうんです。いろんなディレクトリを見ていっている途中、
> MLSD
でピタッと止まってしまう。
Visual C++ 2019からWindows XP向けコード生成が削除される。具体的には
と退化する。このため、Visual C++ 2017向けに書かれたコードがVisual C++ 2015ではコンパイルが通らない。Visual Studio 2019へ移行する場合は自動的にWindows XPサポートを外す必要がある。
Line 100 in 16154e7
ブックマークパスに日本語文字が含まれていると、ここで指定している文字列長がずれるためブックマークが不正になり正しく保存できない。
こちらで指摘いただいた。
https://twitter.com/mn_imd/status/1103826286361763840
https://twitter.com/momo_P/status/984314444669902848
ffftp wiki通りにやってもinstallerがビルドできなかったけど、wixサイトからVisualStudio toolsetを拾って導入したらできるようになった。3.1ビルド完了。
とのことで、前提ソフトウェアが足りていない模様。
エラーを表示しているダイアログの各ボタンをクリックすると以下の動作となる
・「OK」をクリックすると、再度同じエラーダイアログが表示される
・「以降全て」をクリックすると、エラーダイアログを自動的に表示し続ける無限ループに入る
・「全て中止」をクリックすると、エラーダイアログが消えると同時に、ファイルのアップロードが完了する
お世話になります。ご報告です
1:ノートンセキュリティの誤検知
v3.5-x**.zip をダウンロード&解凍。
ノートンセキュリティが
ffftp.exe
ja-JP/ffftp.exe.mui を削除してしまいます。 ノートン側の問題ですが、一応、ご報告。
2:設定をファイルから復元 できない
v3.5のzipファイルは、ノートンでダメでしたが、ffftp-v3.5-x64.msi は、インストールOK でした.zipが、
接続メニュー >設定 >「設定をファイルから復元」 で V3.4で保存した設定ファイル **.INIが読み込めません
従来、C言語だったためにCOMはC interface #define CINTERFACE
を使用していた。C++言語に移行したため、継承を用いたC++ interfaceに移行可能となっている。
WRL; Windows Runtime C++ Template Libraryを使用すると簡単に記述できるが、Windows 8 SDK以降が要求されるため、Windows XP向けにビルドできなくなる。
必要な部分だけ移植するか?
余計なお世話かもしれませんが、軽くコードだけ眺めていたのですが、sha_memory()のエンディアンは大丈夫でしょうか?
— 川本優 (@s_kawamoto) January 2, 2018
逆になっていても動作はしますが、以前のバージョンで保存したマスターパスワード周りの設定を読めなくなるはずです
全設定暗号化の際、設定の改竄チェックを行っている。しかし、チェックサム方式のため、リファクタリングで設定項目が削除されるとチェックサムが一致しない。かといってダミーで不要な設定項目を残していてはリファクタリングの意味がない。
そもそも暗号化下において設定を改竄できるということは暗号化鍵の入手に成功していることを意味している。であればチェックサムも同様に更新してしまえば改竄チェックを逃れられる。また、全設定暗号化は共通鍵方式のため、暗号化鍵で復号でき、パスワードなどの項目も読み取ることができてしまう。そのため、あえて設定を改竄する必要がないとも言える。
というわけで改竄チェックに意義を感じないため、機能削除する。
OSDN版の1.99a-updateブランチからforkしたが、その後、2.00まで開発がすすめられた。その間の修正・更新を取り込む必要がある。
github版ではVC++2017へ移行したことによりプロジェクトファイルが別形式になっている他、C++へ移行したことによりソースコードファイル名も変更されている。それに対しOSDN版は2.00にてソースツリーの構造が変更されている。つまり双方でファイル名が変更されているため単純なmergeは困難な模様。
AthlonXP等、SSE2非搭載プロセッサで動作しない。
reg形式で保存する場合に、regedit
コマンドを使用しているので、UAC昇格が要求される。この辺り
reg
コマンドであれば要求されないので、こちらに切り替える。reg
コマンドがXP以降で使えるか確認する。
@honeylover さんより
ミニバードおよびエックスサーバーを使っています。暗号化タブで、FTPS (Explicit)で接続するようにしています。
FFFTP v3.2およびtest4までで、接続時に「保護されていません」というダイアログが出ます。接続するにはYesを選択する以外無いのですが、接続後ステータスバーに「保護されていません」と表示されます。
それで、その部分をダブルクリックすると証明書が表示されるのですが、証明のパスというタブの下部にある【証明書の状態】には「この証明書は問題ありません。」と書かれています。
パスを全部たどって、証明書を表示させてもすべて問題なしということになっています。私が使っているエックスサーバーでは合計3個の証明書になりますが、すべて問題なしです。
これは、本当に証明書が不正で保護されない接続になってしまっているのでしょうか?
また別ソフトを挙げてしまって申し訳ないですが、Filezillaで接続すると、ステータスバーに閉じた南京錠アイコンがあってそこにカーソルを置くと「接続は暗号化されています。詳細はアイコンをクリックしてください」と出て、クリックすると独自表示の証明書情報が表示され、認証パスの0から2までのうちのどれかを選んで表示させることができますが、どれを見ても何かエラーとか不正みたいな表示は出ていません。もっとも、FFFTPからの表示と違って、問題が無いという表示もありません。
あと、FFFTP osdn版 v2.0 では、証明書は表示できませんが、タイトルバーに「暗号化されています」と表示されています。sayurinさんの投稿からは、保護と暗号化は別件と読めるのですが、つまり、暗号化されていると表示されているからと言って保護されているとは限らないということになるのでしょうか?
ロリポップで提供されるftpサーバーに対して、暗号化なしでは接続できるが、暗号化ありでは右のリストが表示されない。
https://twitter.com/6ka6ka/status/983227793159831552
https://twitter.com/6ka6ka/status/983228318722871297
さくらレンタルサーバーでも同様の現象が発生するとのこと
https://twitter.com/skuromaku/status/983612090890899457
NormalizeString
はXP環境には存在せず、 "Microsoft Internationalized Domain Name (IDN) Mitigation APIs"のインストールが必要。IE7以降に同梱されている。
つまり、XP、IE7未導入環境で動作しない。
https://twitter.com/s_kawamoto/status/1008171091800440832
今のところ不具合には至っていませんが、どうもTLSのSNIの挙動に差があるようです…
FTPサーバーではありませんが、krsgw-雛.com:443にFTPISで接続すると2.00では正しく krsgw-雛.com の証明書が返りますが、3.4では music.krsgw-雛.com のものになり、不正な証明書となってしまいます
Is the "ffftp" with current repository will apply "Revised BSD License" or others?
It feel nice if the license is explicitly declared 👏
表題のままです。
v3.3およびv3.5です(win7なので3.4は起動不可)
ミラーリングダウンロードをしようと「処理内容表示へ進む」ボタンを押してリストを取ったのですが、明らかにローカルとサーバーで同じタイムスタンプなのにリストアップされているものが多数見つかりました。
さらに、そのリストのいくつかを手動でダウンロードし、再度リストを取ってもまたそれらのファイルがミラーリングダウンロードすべきファイルとしてリストアップされてきました。
なお、タイムスタンプの秒は表示させていません。日時は完全に同じです。不思議なのは、すべてではなく、限られた数であることです。サーバーには3000近くあるが、同タイムスタンプでリストされるのは数十とか多くて数百。だからと言って何もいいことはありませんが。。。
試しに、サーバーにあるファイルを全ダウンロードし直し、直後にミラーリングダウンロードリストを取っても同じようにいくつかがリストされてしまいます。
バグだと思うのですが、設定で回避できるなら教えて欲しいです。
ちなみに、この問題が起きるのは minibird です。
xserverではこの問題は起きていません。
名前に半角スペースの入っているファイルをFFFTP ver.3.00 で FTPにて アップロードすると、ファイルをアップロードした上で、スペース迄のパスを元に何等かのものをアップロードしようと試みて タイトル:「FFFTP: エラー」で「*がアップロードできませんでした。」(*にはスペースまでのファイルパスが入る)とテキスト及び選択肢として「後で上書き」「後でリジューム」「アップロードしない」のラジオのついた エラーダイアログが表示される。
ftpライブラリの分離
グローバル変数でガッツリ相互依存しているので、解きほぐす。
GetAddrInfoW
がWSANO_RECOVERY
を返すため、名前解決できな模様。Windowsの仕様か、回避可能な問題か調査する。
まれなケースとは思いますが報告です。
複数人数で一つのサーバーにアクセスするケースです。
一人がミラーリングダウンロードのリストを取り、ダウンロードを始めました。数百のファイルがリストアップされたのでダウンロードにも時間もかかります。そして、その間に、別のユーザーがそのリスト中のあるファイルをダウンロード前に削除してしまいました。
すると、ミラーリングダウンロードしているFFFTPは、そのファイルを何度もダウンロードしようと試みるようです。特に最大限の接続数4で使っていて、そのどれもがその既に存在していないファイルを削除しようとしており、中止ボタンを押してもどうすることもできませんでした。ダウンロードウィンドウが一瞬消えてもすぐにまた復活して来るみたいな。で、常に4つ開いたままになる感じ。
リストアップされたファイルが実際に無いというケースは想定外かもしれませんが、現実には起きうる(というかすでに2回起きた)ことなので対処していただけるとありがたいです。リストアップされたからといって、ダウンロード時にそのファイルが存在している保証はないということですね。
あと、本体の受信中止ボタンを押してもうまくいかなかったり、反応無しになってしまって、強制終了するしかなくなったこともありました。関連性は分かりませんが、何となくですが、数の多さが関係しているような気もします。(←この件は明確にどういうふうだったか記憶がないのでスレッドは立てていません。もしかしたら上記の件と関連性がある(ファイル数が多い)かもと思って念のために書いておきました)
従来はANSIバージョンを使っていた。しかし、内部コードUTF-8化により、API呼び出しの際Wide charに変換後、Unicodeバージョンを呼び出すようになった。
ところが一見すると文字列には関係のなさそうなAPIでも内部でANSI / Unicodeバージョンが用意されているものがあり、それらは従来通りANSIバージョンを呼び出すコードのまま残っている。
dumpbin /imports Debug\x86\ffftp.exe
より
現状、利用されているノンブロッキングI/Oでは必要量のデータが読み取れるまで何度も呼び出しを繰り返す必要があり、ロジックが複雑になっている。もしくは面倒な場面ではブロッキングI/Oになっている。
そこで非同期I/Oに切り替え、必要量のデータが読み込めた時点で処理を再開できるようにする。C#言語のasync
/ await
に似たco_await
を使用する。
パスワードが16文字の倍数だと保存に失敗する、気がする
Windows 8.1でx64版で忍者ホームページにてAUTH TLSで234 AUTH TLS successfulが返ってきた直後にエラーになります
Windowsの制約でProgram Filesフォルダへの書き込みは出来ない為
FFFTP 3.5 を起動して最初のミラーリングダウンロードのリスト取得中(「処理内容表示へ進む」ボタン)
--(snip)--
>MLSD
150 Opening ASCII mode data connection for MLSD
ファイル一覧の取得を中止しました.
>CWD /
ここで止まってしまいました。ツールバーは、受信中止ボタン以外は全部グレーアウト。
いずれにせよ、もう止まってしまっていてどうしようもないので、他の選択肢も無いことだし受信中止ボタンを押したら、以下のように行が表示されていきました。特に、最初の CWDコマンドの数十行は、バッファに溜まっていたものが吐き出されたような感じで一瞬で一気に表示されました。
>CWD aaaaaaaaa/aaa
>CWD aaaaaaaaa/bbb
>CWD aaaaaaaaa/ccc
数十行継続
>CWD aaaaaaaaa/zzzz
>CWD bbbbbbb
>CWD cccccc
>CWD ddddddd
数十行継続
>CWD xxxxxxx
>CWD yyyyyyy
>CWD zzzzzzz
再接続します.
ここまでは受信中止ボタンを押した瞬間に一気に表示された。溜まっていたものが一気にフラッシュされた感じ。
FTP over Explicit SSL/TLS (FTPES)を使用します.
ホスト xxxxxxxxxxxxxxxxx (aaa.bbb.ccc.ddd:21) に接続しています.
接続しました.
220 FTP Server ready.
>AUTH TLS
234 AUTH TLS successful
>PBSZ 0
200 PBSZ 0 successful
>PROT P
200 Protection set to Private
>USER zzzzzzzzzzzz
331 Password required for zzzzzzzzzzzz
>PASS [xxxxxx]
230 User zzzzzzzzzzzz logged in.
>FEAT
211-Features:
MDTM
MFMT
TVFS
AUTH TLS
MFF modify;UNIX.group;UNIX.mode;
MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
PBSZ
PROT
REST STREAM
SIZE
211 End
>CWD /
250 CWD command successful
>XPWD
257 "/" is the current directory
再接続します.
再接続します.
FTP over Explicit SSL/TLS (FTPES)を使用します.
FTP over Explicit SSL/TLS (FTPES)を使用します.
ホスト xxxxxxxxxxxxxxxxx (aaa.bbb.ccc.ddd:21) に接続しています.
ホスト xxxxxxxxxxxxxxxxx (aaa.bbb.ccc.ddd:21) に接続しています.
>TYPE A
200 Type set to A
接続しました.
接続しました.
>PASV
220 FTP Server ready.
220 FTP Server ready.
>AUTH TLS
227 Entering Passive Mode (aaa,bbb,ccc,ddd,234,128).
>AUTH TLS
ダウンロードのためにホスト aaa.bbb.ccc.ddd (aaa.bbb.ccc.ddd:60032) に接続しています.
234 AUTH TLS successful
234 AUTH TLS successful
接続しました.
>MLSD
150 Opening ASCII mode data connection for MLSD
>PBSZ 0
>PBSZ 0
200 PBSZ 0 successful
200 PBSZ 0 successful
>PROT P
>PROT P
200 Protection set to Private
200 Protection set to Private
>USER zzzzzzzzzzzz
>USER zzzzzzzzzzzz
226 Transfer complete
ファイル一覧の取得は正常終了しました. (15892 Bytes)
331 Password required for zzzzzzzzzzzz
331 Password required for zzzzzzzzzzzz
>PASS [xxxxxx]
>PASS [xxxxxx]
230 User zzzzzzzzzzzz logged in.
230 User zzzzzzzzzzzz logged in.
>FEAT
>FEAT
211-Features:
211-Features:
MDTM
MDTM
MFMT
MFMT
TVFS
TVFS
AUTH TLS
AUTH TLS
MFF modify;UNIX.group;UNIX.mode;
MFF modify;UNIX.group;UNIX.mode;
MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
PBSZ
PBSZ
PROT
PROT
REST STREAM
REST STREAM
SIZE
SIZE
211 End
211 End
>TYPE A
200 Type set to A
>PASV
227 Entering Passive Mode (aaa,bbb,ccc,ddd,234,128).
ダウンロードのためにホスト aaa.bbb.ccc.ddd aaa.bbb.ccc.ddd:60032) に接続しています.
接続しました.
>MLSD
150 Opening ASCII mode data connection for MLSD
226 Transfer complete
ファイル一覧の取得は正常終了しました. (15892 Bytes)
>TYPE A
200 Type set to A
>PASV
227 Entering Passive Mode (aaa,bbb,ccc,dd,234,105).
ダウンロードのためにホスト aaa.bbb.ccc.ddd (aaa.bbb.ccc.ddd:60009) に接続しています.
接続しました.
>MLSD
150 Opening ASCII mode data connection for MLSD
226 Transfer complete
ファイル一覧の取得は正常終了しました. (15892 Bytes)
途中で再接続の行が2行あり、その後も同じコマンドが2行ずつ続いているのも何か変な感じです。
最後の部分は、接続維持のためだと思いますが、この繰り返し。ポートだけが違いますが。
固有のものは適当なアルファベットで伏せました。
全てのダイアログについてウィンドウプロシージャが静的関数となっているため、ダイアログで使用するデータがグローバル変数とならざるを得ない。ダイアログがインスタンス化されれば関連データもメンバー変数に保持できるようになる。
GetWindowLongPtr(GWLP_USERDATA)
を使用することでthis
ポインターが格納可能となる。
これら機能を備えたtemplate classを用意する。
既存の漢字コード変換はUTF-8変換が後付けで追加されているため、変換がややこしくなっている。また、ファイル名の変換はremote.cpp
に、ファイルコンテンツの変換はgetput.cpp
にそれぞれ実装されており分散している。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.