忍者ブログ
  • 2024.12«
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • » 2025.02
PythonのWriting for Definition

Pythonの変数のスコープについてなぜグローバル変数を用いるためにglobalをつける必要があるか考察してみた。

まず、C言語の関数から見てみよう

int func()
{
    int L;
    L = 23;
    printf("%d%s", L, G); //出力:"23bit"
}

C言語において、変数は「Use with definition」である。
この関数を見て分かることは変数Lがローカルで宣言されているため、ローカル変数であり、変数Gはローカルではないということである。

次に、VBの関数を見てみよう。

Sub func
    L = 23
    print L & G ’出力:"23bit"
End Sub

VBにおいて、Option Explicitをつけない場合、変数は「Use without definition」である。
この関数をみて分かる事はLはローカル変数かもしれないし、グローバル変数かもしれない。
(グローバル変数として動いた気はするけども、参照が他になければローカル変数と変わらない)
Gは確実にグローバル変数であるということである。
なぜなら、G="bit"であり他所で確実に設定されているためである。
これを逆説的に言うと、関数内を見渡して未設定で参照のみの変数が使われている場合、ローカル変数では有りえない。ということである。

いよいよPythonの関数を見てみよう

def func():
    L = 23
    print L,G #出力:"23bit"

Pythonにおいて、変数は「Use with definition. But writing is definition.」である。
なんとなく、CとVBの両方の経験者は「Use without definition」と捕らえてしまいがちであるが、よくよくググってみても変数を宣言しなくても使えると書いているサイトは見当たらない。

関数内を見渡して、Lはここで値を設定しているのでローカル変数であり
Gは値を設定していないのでローカル変数ではない。
もっと言えば、VBにおいて、Gがローカル変数ではない理由は動かすか、グローバル変数宣言部を見るかしないと分からない。

しかし、Pythonの場合、関数func内をみるだけで完結する。
このように、ローカル変数が未設定で参照のみが行われることはないという特徴をグローバル変数と見做すというのは非常に上手いやりかたに思える。

実際に変数Gには何が設定されているのか知りたければGで検索すれば設定場所がひっかかる。

def func2():
    global G
    G = "bit"

global変数に値を設定する場合、ローカル変数の「値を設定して使う」というルールに参加させるため、globalキーワードを用いる。
これで、どれだけグローバル変数Gが多くの箇所で使われていようが設定している箇所をすべて見つけることができるのである。

なぜ、こんな仕様になったのか考えてみると、システム屋ではない人が作ってもPythonは整った文になるように設計されているということである。
意外と素人に多いコーディングは、めんどくさいから取り敢えずローカル変数をグローバル変数に 持っていくというものである。一番ひどい場合、ループ変数さえも持っていくのである。
しかし、グローバル変数にループ変数を宣言したところでそれを使うのがめんどくさいのがPythonの特徴である。
ローカル変数宣言の1行を省略できるのにglobalを付けてグローバルのループ変数をわざわざ宣言して使う人は少ないだろう。

さらに次のルールが生まれる。

◎1ソースであれば、グローバル変数名で検索して見つかった箇所が全て関数内でのみ、かつglobalキーワードが使われていない場合、グローバル変数は未使用である。

◎globalキーワード付変数を使わない関数を、他のソースに流用した場合において、ローカル変数名とグローバル変数名がたまたま一致したために、ローカル変数への代入がグローバル変数の更新に繋がることはない。

とてもよく考えられているルールではないだろうか?

拍手[0回]

PR
【2014/12/27 08:45 】 | Python | 有り難いご意見(0)
プログラムの複数引数ファイルの順序の謎
windows8.1で複数ファイルをコピーしてみたら、へんてこな順序になるときがある。

対象引数ファイル

track1.txt
track2.txt
track3.txt
track4.txt
track5.txt
track6.txt





対象プログラム a.bat

@echo %*





対象引数ファイルを対象プログラムの上に持っていった結果は

track4.txt
track5.txt
track6.txt
track1.txt
track2.txt
track3.txt





なぜだと思ったら、移動させるときに『track4.txt』の上からa.batファイルに移動してた。

『track1.txt』の上からから始めると

track1.txt
track2.txt
track3.txt
track4.txt
track5.txt
track6.txt





うむむ、アクティブファイル1個を引数と取るバッチファイルに誤って複数選択して移動してしまっても大丈夫なようにこんな風になっているのだろうか・・。

奥が深い。

拍手[0回]

【2014/05/06 14:35 】 | windows | 有り難いご意見(0)
How to use Wireless Network With WLI-UC-GNM2 [RT3070]&HostAP 802.11n&WPA2RSK
I'm very tired looking for this process.
I'll write this article for anyone who need this info.

(1)Insall hostapd.

(2)copy your working directory. and edit.

(a) cp /usr/share/doc/hostapd-2.0/hostapd.conf .

(b)Editing Point of hostapd.conf is that I explain with patch.


@@ -16,13 +16,13 @@
# added to the bridge automatically (brctl may refuse to do this before hostapd
# has been started to change the interface mode). If needed, the bridge
# interface is also created.
-#bridge=br0
+bridge=br0 #create gateway of AP. Concrete doing is follow .

# Driver interface type (hostap/wired/madwifi/test/none/nl80211/bsd);
# default: hostap). nl80211 is used with all Linux mac80211 drivers.
# Use driver=none if building hostapd as a standalone RADIUS server that does
# not control any wireless/wired driver.
-# driver=hostap
+driver=nl80211 #If your driver isn't hardAP, select nl80211

# hostapd event logger configuration
#
@@ -83,31 +83,21 @@
##### IEEE 802.11 related configuration #######################################

# SSID to be used in IEEE 802.11 management frames
-ssid=test
-# Alternative formats for configuring SSID
-# (double quoted string, hexdump, printf-escaped string)
-#ssid2="test"
-#ssid2=74657374
-#ssid2=P"hello\nthere"
-
-# UTF-8 SSID: Whether the SSID is to be interpreted using UTF-8 encoding
-#utf8_ssid=1
+ssid=SSID_NAME #Name you like one.

# Country code (ISO/IEC 3166-1). Used to set regulatory domain.
# Set as needed to indicate country in which device is operating.
# This can limit available channels and transmit power.
-#country_code=US
+country_code=JP #Select your country

# Enable IEEE 802.11d. This advertises the country_code and the set of allowed
# channels and transmit power levels based on the regulatory limits. The
# country_code setting must be configured with the correct country for
# IEEE 802.11d functions.
# (default: 0 = disabled)
-#ieee80211d=1
+ieee80211d=1 #It maybe check your law wireless restriction.

# Operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g,
-# ad = IEEE 802.11ad (60 GHz); a/g options are used with IEEE 802.11n, too, to
-# specify band)
# Default: IEEE 802.11b
hw_mode=g #To use with 802.11n, select 'g'.
@@ -194,7 +184,7 @@
# Bit fields of allowed authentication algorithms:
# bit 0 = Open System Authentication
# bit 1 = Shared Key Authentication (requires WEP)
-auth_algs=3
+auth_algs=1 #I don't use WEP, So I changed 3 to 1.

# Send empty SSID in beacons and ignore probe request frames that do not
# specify full SSID, i.e., require stations to know SSID.
@@ -393,7 +370,7 @@
# 0 = disabled (default)
# 1 = enabled
# Note: You will also need to enable WMM for full HT functionality.
-#ieee80211n=1
+ieee80211n=1 #This let you happy. I tried and see changing 54Mbps to 65Mbps. I'm very happy

# ht_capab: HT capabilities (list of flags)
# LDPC coding capability: [LDPC] = supported
@@ -428,161 +405,10 @@
# DSSS/CCK Mode in 40 MHz: [DSSS_CCK-40] = allowed (not allowed if not set)
# PSMP support: [PSMP] (disabled if not set)
# L-SIG TXOP protection support: [LSIG-TXOP-PROT] (disabled if not set)
-#ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40]
+ht_capab=[HT+][SHORT-GI-40] #I select feeling and seeing net infomation. Ahaha. Don't worry missing. Bad selection point is that program will tell you! Let's challenge.

# Require stations to support HT PHY (reject association if they do not)
-#require_ht=1
+require_ht=1 #Let's challenge!

##### IEEE 802.1X-2004 related configuration ##################################
@@ -923,7 +679,7 @@
# and/or WPA2 (full IEEE 802.11i/RSN):
# bit0 = WPA
# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
-#wpa=1
+wpa=2 #WPA2/RSK

# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit
# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase
@@ -931,8 +687,8 @@
# so the PSK changes when ASCII passphrase is used and the SSID is changed.
# wpa_psk (dot11RSNAConfigPSKValue)
# wpa_passphrase (dot11RSNAConfigPSKPassPhrase)
-#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
-#wpa_passphrase=secret passphrase
+#wpa_psk=
+wpa_passphrase=YOUR_PASSWORD

# Optionally, WPA PSKs can be read from a separate text file (containing list
# of (PSK,MAC address) pairs. This allows more than one PSK to be configured.
@@ -940,20 +696,11 @@
# configuration reloads.
#wpa_psk_file=/etc/hostapd.wpa_psk

-# Optionally, WPA passphrase can be received from RADIUS authentication server
-# This requires macaddr_acl to be set to 2 (RADIUS)
-# 0 = disabled (default)
-# 1 = optional; use default passphrase/psk if RADIUS server does not include
-# Tunnel-Password
-# 2 = required; reject authentication if RADIUS server does not include
-# Tunnel-Password
-#wpa_psk_radius=0
-
# Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The
# entries are separated with a space. WPA-PSK-SHA256 and WPA-EAP-SHA256 can be
# added to enable SHA256-based stronger algorithms.
# (dot11RSNAConfigAuthenticationSuitesTable)
-#wpa_key_mgmt=WPA-PSK WPA-EAP
+wpa_key_mgmt=WPA-PSK #I deleted it. Because I don't use EAP.

# Set of accepted cipher suites (encryption algorithms) for pairwise keys
# (unicast packets). This is a space separated list of algorithms:
@@ -965,9 +712,9 @@
# TKIP will be used as the group cipher.
# (dot11RSNAConfigPairwiseCiphersTable)
# Pairwise cipher for WPA (v1) (default: TKIP)
-#wpa_pairwise=TKIP CCMP
+#wpa_pairwise=TKIP
# Pairwise cipher for RSN/WPA2 (default: use wpa_pairwise value)
-#rsn_pairwise=CCMP
+rsn_pairwise=CCMP TKIP #I use WPA2. so I comment out.

# Time interval for rekeying GTK (broadcast/multicast encryption keys) in
# seconds. (dot11RSNAConfigGroupRekeyTime)
@@ -1004,7 +751,7 @@
# allowed. This is only used with RSN/WPA2.
# 0 = disabled (default)
# 1 = enabled
-#peerkey=1
+peerkey=1 #I discover this point!!! But sometime no relation.. It works. Umm.

# ieee80211w: Whether management frame protection (MFP) is enabled
# 0 = disabled (default)



(3)exec "sudo hostapd hostapd.conf -d " and access from client machine.

[APPENDIX]
(a)You need driver rt2x00lib (rt2800usb,rt2800lib,rt2x00usb)
(b)Exec "rfkill list" and confirm the result.
6: phy5: Wireless LAN
Soft blocked: no
Hard blocked: no
(c)If Soft blocked is yes, Exec "sudo rfkill unblock wifi"
(d)If Hard blocked is yes, Exec "echo 1 | sudo tee /sys/class/rfkill/rfkill(any number)/state"


I'm happy for your help.

拍手[0回]

【2014/01/02 10:02 】 | linux | 有り難いご意見(0)
Debianインストール時の注意
(1)/bootをext4にすると、GRUBインストール時にファイルが見つからない言うて起こられる。
※手動インストールしようとしても、ファイル名が見えなかったりする。
 私は誤ってext4にしてしまったため、ファイルを退避、フォーマット、ファイル復元と面倒で悲しい結果に・・・。

(2)HDはvirtioではなくideつなぎにする。
ideじゃないと認識せずにNo bootable diskとか・・
※インストール時にはいけたみたいですが・・・

(3)後にWindowsを入れたければ、最初のプライマリパーティション分の領域を1G取っておく。
※4Gバイト以降にVistaを入れようとしても、システムないよって起こられて
 ntfs-g3でntfs作っても起こられて、結局Windowsインストーラで5番目のパーティションを削除・新規・フォーマットして入れようとしたら・・・、1個目のパーティションにシステムボリューム作ってもいい?ってきかれました・・。そんなんどこにものってないわ。

拍手[0回]

【2013/12/31 12:05 】 | linux | 有り難いご意見(0)
モニタなしPCへのDebianインストール
前にssh経由でLFSを構築したことがあってほおってたマシンを再利用できないかと考えて、
また作成することにした。
今回はVNC経由でソースからの構築ではなくディストリビューションDebianを入れることにする。

拍手[0回]

【2013/12/30 14:58 】 | linux | 有り難いご意見(0)
前ページ | ホーム | 次ページ

忍者ブログ [PR]