まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2015/11

このブログエントリの続きです:
LUA で FlashAir の特定フォルダ内の最新ファイルを探す

↑この時の内容は、特定フォルダ「内」の最新ファイルを探す LUA スクリプトの紹介でしたが、ちょっとパワーアップして特定フォルダ「以下」の最新ファイルを探すようにしています。

特定フォルダ以下、といっても無限に探してくれるものではありません。実際のデジカメの挙動では、写真を撮影すると、"/DCIM/(どこかのディレクトリ)/***.jpg" みたいな感じで画像ファイルが格納されるらしいです。この「(どこかのディレクトリ)」という部分がメーカーによって変わったり、ある一定以上のファイルが1つのフォルダに貯まると別のディレクトリを作ったりして格納されるらしいのです(また聞き)。なので、この「(どこかのディレクトリ)」部分は最初に固定して考えるわけにはいかないが、これ以上の孫階層が作られるといったものでもない、ということだと思います。

で、その前提で「/DCIM 以下にある最新ファイルを探す」というスクリプトに作り変えてみました。要はサブフォルダが作られるとしたら1階層だけ作られて上で格納されるファイルの中で最新のものを探す、という内容に改良してみました、というものです:
last_fname = ""
last_fpath = ""
max_mod = 0
fpath = "/DCIM"  目的のフォルダ
for dirname in lfs.dir(fpath) do
  dirpath = fpath .. "/" .. dirname
  mod_dir = lfs.attributes( dirpath, "mode" )
  if mod_dir == "directory" then サブフォルダを再度調べる
    for filename in lfs.dir(dirpath) do
      filepath = dirpath .. "/" .. filename
      mod = lfs.attributes( filepath, "modification" )
      if mod > max_mod then
      max_mod = mod
        last_fname = filename
        last_fpath = filepath
      end
    end
  else fpath 直下にファイルがあった場合は対象にする
    mod = lfs.attributes( dirpath, "modification" )
    if mod > max_mod then
      max_mod = mod
      last_fname = dirname
      last_fpath = dirpath
    end
  end
end

   :
 (この時点で last_filepath に最新ファイルのパスが格納されている)
   :

これでかなり実用的になったはず。。


自分は CentOS をサーバー用途だけでなく、X Window System と日本語環境、そして GNOME を入れて、壁紙やスクリーンセーバーも設定してデスクトップクライアントとしても使っています:
2015110101


サーバー用途であれば有線 LAN を繋いで起動しっぱなし・・でいいのですが、デスクトップとして使おうとすると、やはり無線 LAN を使いたくなります。公衆 WiFi にせよ、テザリングにせよ、PCを持ち歩く前提で、その持ち歩き先でネットワークを使うには無線 LAN しかないことも多いです。この無線 LAN を CentOS で使う場合の設定方法を備忘録も兼ねて紹介します。

ちなみに自分は CentOS 6 を使っています。デスクトップ Linux というと Ubuntu の印象が強いかもしれませんが、自分はサーバーとしては普段 CentOS 使いであることに加え、LibreOffice にせよ、IBM Notes にせよ、ウェブブラウザにせよ、デスクトップクライアントとして必要と思われるアプリはほぼ CentOS でも動きます。なので、自分としては慣れた CentOS を使うことにしているのでした。


まず、何はともあれ無線 LAN デバイスが認識されている必要があります。iwconfig コマンドで wlan0 が認識されているかどうかを確認します:
# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11abgn  ESSID:"(ACCESSPOINT名)"
          Mode:Managed  Frequency:2.462 GHz  Access Point: (MACアドレス)
          Bit Rate=58.5 Mb/s   Tx-Power=15 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=41/70  Signal level=-69 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:10112  Invalid misc:816   Missed beacon:0

↑こんな感じで wlan0 デバイスが表示されれば無線 LAN デバイスが OS で認識されていることになります。認識されていない場合は、使っている機種のデバイスドライバを導入するなどして、OS が無線 LAN デバイスを認識している状態にしておく必要があります。

では、この認識された wlan0 を無線 LAN に接続して実際に IP アドレスが割当られるようにします。/etc/sysconfig/network-script/ifcfg-wlan0 を以下のような内容で作成します:
DEVICE="wlan0"
ONBOOT="yes"
BOOTPROTO=dhcp
TYPE=Wireless
MODE=Auto
ESSID="(ACCESSPOINT名)"
IPV6INIT=no
NAME="System wlan0"

↑この例のように ONBOOT="yes" としておくと、起動と同時に有効になります。また TYPE=Wireless としておきます。ESSID には接続先の SSID を記載しておきます。

また /etc/sysconfig/wpa_supplicant の INTERFACES に wlan0 が含まれるようにしておきます:
  :
: INTERFACES="-iwlan0"
: :

具体的な SSID や接続形式を指定した接続設定は /etc/wpa_supplicant/wpa_supplicant.conf に記述します。このファイルの雛形を wpa_passphrase コマンドを使って作成します:
# wpa_passphrase ACCESSPOINT PASSPHRASE > /etc/wpa_supplicant/wpa_supplicant.conf

↑ ACCESSPOINT には SSID 名を、PASSPHRASE には接続パスフレーズ(パスワード)を指定します。この後に作成される /etc/wpa_supplicant/wpa_supplicant.conf をテキストエディタで開きます:

ctrl_interface=/var/run/wpa_supplicant
#ctrl_interface_group=wheel
ap_scan=1
network={
        ssid="ACCESSPOINT"
        key_mgmt=WPA-PSK
        proto=WPA WPA2
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        #psk="PASSPHRASE"
        psk=*********************************************************************
}


↑この例では WPA2 で接続することを指定したかったので、赤字の部分を後から追記しています。


では実際に接続サービスを実行するために必要なファイル(/etc/init.d/prepnet)を以下の内容で用意します:
#!/bin/sh

/etc/init.d/messagebus start
/etc/init.d/wpa_supplicant start
killall dhclient >/dev/null 2>&1

実際にサービスとして必要なファイルは /etc/rc5.d/S09prepnet ですが、/etc/init.d/prepnet からシンボリックリンクを作成します:
# chmod a+rx /etc/init.d/prepnet
# ln -s /etc/init.d/prepnet /etc/rc3.d/S09prepnet
# ln -s /etc/init.d/prepnet /etc/rc5.d/S09prepnet

最後にサービスの自動実行設定を行います:
# chkconfig messagebus off
# chkconfig wpa_supplicant off
# chkconfig NetworkManager off
# chkconfig network on

ここまで行ってシステムを再起動すると、指定した SSID に接続して、IP アドレスが割り振られるところまでが確認できるようになります:
# ifconfig
  :
  :
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:608 (608.0 b)  TX bytes:608 (608.0 b)

wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.0.XXX  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:182828 errors:0 dropped:0 overruns:0 frame:0
          TX packets:176362 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:23847854 (22.7 MiB)  TX bytes:189332502 (180.5 MiB)
  :
  :

一昔前と違って、CentOS でも Skype アプリはあるし、LINE も(Chrome プラグインで)動くので CentOS をデスクトップ環境として採用できない理由はあまりないなあ、と思ってます。敢えて言えば iTunes はない。けど、個人的には iTunes に縛られたくないんだよね~。。


このページのトップヘ