ইন্টারনেট সংযোগের জন্য চেক করতে এলিস্প কোড


13

আমি যখন ইমাকগুলি খুলি, এটি আমার সূচনা ফাইলটি মূল্যায়ন করে, যার মধ্যে ইন্টারনেট সংযোগের মাধ্যমে আমার প্যাকেজ সংরক্ষণাগারগুলি সতেজ করা। যখন আমার কাছে ইন্টারনেট সংযোগ নেই তখন এটি সমস্যাযুক্ত হয়, সুতরাং ইন্টারনেট সংযোগ ছাড়াই ইমাস শুরু করার সময় আমাকে সেই কোডটি কার্যকর করা আটকাতে হবে। এই সমস্যাটি সমাধান করার জন্য, আমি অবাক হয়েছি যে আমার সাথে ইন্টারনেট সংযোগ নেই যখন প্যাকেজ রিফ্রেশ কোডটি ইম্যাকস উপেক্ষা করার কোনও উপায় আছে?

এখানে আমার প্রথম কয়েকটি লাইন রয়েছে init.el:

;; Requisites: Emacs >= 24
(require 'package)
(package-initialize)

;; PACKAGE MANAGEMENT
(add-to-list 'package-archives 
  '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-refresh-contents)       

আমি ধারণা করি যে আমি আমার ইমাস ফাইলটি লোড করার জন্য কোডটি যুক্ত করতে পারি:

;; Requisites: Emacs >= 24
(when (connected-to-internet-p)   ; I need this predicate function
  (require 'package)
  (package-initialize)
  (add-to-list 'package-archives 
               '("melpa" . "http://melpa.milkbox.net/packages/") t)
  (package-refresh-contents))

(connected-to-internet)এই সমস্যাটি সমাধান করার জন্য কোনও ফাংশন বা অনুরূপ পন্থা রয়েছে কি ?


2
এখানে সম্পর্কিত উত্তর রয়েছে stackoverflow.com/a/21065704/3170376
নাম

2
আপনি যখন ইমাস শুরু করবেন তখন কেন আপনি প্যাকেজ সংরক্ষণাগারগুলি রিফ্রেশ করতে চান?
ফিল্ডস

@ নাম এটি সম্পর্কিত আরও বেশি। এটা উত্তর (অভিমানী এটি কাজ করে)।
মালবারবা

1
আমি দৃ strongly়ভাবে পরামর্শ দেব যে আপনি প্রতিটি প্রারম্ভকালে প্যাকেজ-রিফ্রেশ-সামগ্রী চালাবেন না। এটি সম্ভবত সম্ভবত কোনও নতুন মেশিনে আপনার কনফিগারেশনটি টানানোর পরে আপনাকে একবার চালাতে হবে এবং তারপরে কয়েক মাস আপনার প্রয়োজন হবে না। আপনার সংযোগ থাকা অবস্থায় এটি করা এই সমস্যার ভুল উত্তর, আসল সমস্যাটি হ'ল আপনি যখন প্রয়োজন হবেন না তখন আপনি একে একে চালাচ্ছেন।
জর্ডন বিওনডো

উত্তর:


7

ঠিক আছে, আপনি এখনও যদি সামগ্রীগুলি স্বয়ংক্রিয়ভাবে রিফ্রেশ করতে চান, যখনই সম্ভব, আপনি নীচের কোডের মতো কিছু করতে পারেন:

(defun can-retreive-packages ()
  (cl-loop for url in '("http://marmalade-repo.org/packages/"
                        "http://melpa.milkbox.net/packages/"
                        "http://elpa.gnu.org/packages/")
           do (condition-case e
                  (kill-buffer (url-retrieve-synchronously url))
                (error (cl-return)))
           finally (cl-return t)))

কয়েকটি নোট বাকি আছে:

  1. এটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়।
  2. সাধারণভাবে ইন্টারনেট সংযোগের জন্য পরীক্ষা করার কোনও উপায় নেই। আপনি কেবল আবিষ্কার করতে পারেন যে আপনি চেষ্টা করেছেন এমন কিছু সময়ের পরে আপনি কোনও নির্দিষ্ট পরিষেবার সাথে সংযোগ করতে সক্ষম নন। এটি এত ধীর হওয়ার কারণগুলির মধ্যে এটিও অন্যতম।
  3. কোডটি কীভাবে সমস্যাটির কাছে যেতে পারে তার একটি চিত্রণ। আপনি (ignore-errors (package-refresh-contents))সফল হয়েছিলেন কি না তা যদি আপনি যত্ন না করেন তবে আপনি সহজেই কাজটি করতে পারতেন ।

এটি স্পষ্টভাবে এটি করার সঠিক উপায়। যে কোনও এক সময়ে, ইন্টারনেটের কিছু অংশ অ্যাক্সেসযোগ্য এবং কিছু না পাওয়া যায় এবং এর সাথে মোকাবিলা করার উপযুক্ত উপায় হ'ল সংযোগের অনুসন্ধান করা।
jch

1
এটি বৃহত্তর অদেখা বাফারগুলির একটি গোছাও তৈরি করবে, এটি সবচেয়ে ভাল হবে (কিল-বাফার (url-ret ...))
জর্ডন বিওনদো

@ জর্ডন বিয়নদো ঠিক আছে, পয়েন্টটি নেওয়া হয়েছে। এটি সম্পর্কে চিন্তা করা হয়নি।
wvxvw

6

আমি আমার শেল স্ক্রিপ্টগুলি থেকে একটি সহজ সমাধান গ্রহণ করেছি

(defun internet-up-p (&optional host)
    (= 0 (call-process "ping" nil nil nil "-c" "1" "-W" "1" 
                       (if host host "www.google.com"))))

আপনি এটি *scratch*বাফারে পরীক্ষা করতে পারেন :

(message (if (internet-up-p) "Up" "Down"))
"Up"

আমি এই সমাধানটি সবচেয়ে পছন্দ করি কারণ এটি সহজ, দ্রুত এবং বৃহত্তর ইন্টারনেটের সাথে সংযোগটি পরীক্ষা করে।
মাইগুয়েলমোরিন

4

একটি জিনিস আপনি চেষ্টা করতে পারেন ফাংশন network-interface-list। এটি নেটওয়ার্ক ইন্টারফেস এবং তাদের আইপি ঠিকানাগুলির একটি তালিকা ফিরিয়ে দেয়।

আমার জন্য, যখন আমি ইথারনেট এবং ওয়াইফাই উভয়ের সাথে সংযুক্ত থাকি তখন এটিই ফিরে আসে:

(("en5" .
  [10 151 0 63 0])
 ("en0" .
  [10 151 2 76 0])
 ("lo0" .
  [127 0 0 1 0]))

এবং যখন আমি ওয়াইফাইটি বন্ধ করি, en0অদৃশ্য হয়ে যায়:

(("en5" .
  [10 151 0 63 0])
 ("lo0" .
  [127 0 0 1 0]))

এটি পরীক্ষা করে দেখুন এবং যখন আপনার কাছে ইন্টারনেট সংযোগ নেই তখন আপনি কী পান। উদাহরণস্বরূপ, কেবলমাত্র প্যাকেজগুলি রিফ্রেশ করার জন্য, এর en0মতো কিছু করুন:

(when (assoc "en0" (network-interface-list))
  (package-refresh-contents))

এটি একটি আকর্ষণীয় ফাংশন। আমি পেয়েছি (("eth0" . [10 72 153 234 0]) ("lo" . [127 0 0 1 0]))কারণ আমি ইথারনেটের সাথে সংযুক্ত রয়েছি।
দক্ষ মোদী

3

লেগোস্কিয়ার উত্তরে প্রসারিত করতে:

(defun test-internet ()
  (remove-if (lambda (el)
                   (string-match-p "lo.*" (car el)))
                 (network-interface-list)))

এটি সক্রিয় নেটওয়ার্ক সংযোগগুলির একটি তালিকা ফিরিয়ে দেবে ( lo.*এটি লুপব্যাক ইন্টারফেস, loঅন্যদের ক্ষেত্রে কিছু ক্ষেত্রে lo#

যদি পরীক্ষাটি ফিরে আসে non-nil, তবে সেখানে নেটওয়ার্ক সংযোগ রয়েছে (ওয়াইফাই / ইথারনেট, এটি বাইরের ইন্টারনেটে আসলে পৌঁছানোর কোনও গ্যারান্টি নেই that এর পরীক্ষার জন্য কোথাও পিং লাগাতে হবে), যদি এটি ফিরে আসে nilতবে প্যাকেজটি পুনরুদ্ধার করার কোনও উপায় নেই তালিকা।


2

আমি loopbackইন্টারফেস এবং ভার্চুয়ালবক্স এবং ডকার ইন্টারফেস বাদ দিতে নিম্নলিখিতটি ব্যবহার করি । আমি আশা করি এটি সহায়ক।

(defun tzz-has-network ()
  (remove-if (lambda (i)
               (or (string-match-p "\\(vboxnet\\|docker\\).*" i)
                   (member 'loopback (nth 4 (network-interface-info i)))))
             (mapcar 'car (network-interface-list))))

2

ডিবিস এবং নেটওয়ার্কম্যানেজার সহ একটি আধুনিক লিনাক্স সিস্টেমে:

(defun nm-is-connected()
  (equal 70 (dbus-get-property
             :system "org.freedesktop.NetworkManager" "/org/freedesktop/NetworkManager"
             "org.freedesktop.NetworkManager" "State")))

1

আমি মনে করি আপনি এটি ভুল উপায়ে দেখছেন। আপনি যদি সত্যিই আপনার প্যাকেজগুলি স্বয়ংক্রিয়ভাবে আপডেট করতে চান, তবে এটি সূচনাকালে সিঙ্ক্রোনালিভাবে করবেন না: এটি কোনও ধরণের অলস টাইমার থেকে করুন do যেমন

(run-with-idle-timer 10 nil
  (lambda ()
    (package-refresh-contents)
    ..etc..))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.