Linux(ゲスト)から、リモート側(LANの別のPC)のWindows共有ファイルへのアクセス
マウントポイントディレクトリを作成
# mkdir /mnt/pcshare
Windows(ホスト)で共有設定
Linuxからマウント
# mount -t cifs //192.168.56.1/tmp /mnt/pcshare -o username=your_windows_account,password=xxx
以上でおk
# ls /mnt/pcshare
...
2015年9月4日金曜日
2015年6月4日木曜日
一番簡単なSambaサーバ設定
/etc/samba/smb.conf
[global]
workgroup = workgroupname
netbios name = hostname
security = share
[public]
path = /home/share
comment = public folder
writable = yes
public = yes
guest only = yes
guest ok = yes
[global]
workgroup = workgroupname
netbios name = hostname
security = share
[public]
path = /home/share
comment = public folder
writable = yes
public = yes
guest only = yes
guest ok = yes
Win7/8 USBブートDisk作成
Win7 USBブートDisk作成
管理者権限でコマンドプロンプト起動
> diskpart
DISKPART> list disk ※ ここでdisk番号を確認。以降の「1」を置き換え
DISKPART> select disk 1
DISKPART> clean
DISKPART> create partition primary
DISKPART> select partition 1
DISKPART> active
DISKPART> format fs=fat32
DISKPART> assign
DISKPART> exit
USB memoryへ
c:\> xopy d:\*.* /s/e/f e:\
c:\> cd /d d:boot
d:boot> bootsect /nt60 e:
管理者権限でコマンドプロンプト起動
> diskpart
DISKPART> list disk ※ ここでdisk番号を確認。以降の「1」を置き換え
DISKPART> select disk 1
DISKPART> clean
DISKPART> create partition primary
DISKPART> select partition 1
DISKPART> active
DISKPART> format fs=fat32
DISKPART> assign
DISKPART> exit
USB memoryへ
c:\> xopy d:\*.* /s/e/f e:\
c:\> cd /d d:boot
d:boot> bootsect /nt60 e:
2015年6月3日水曜日
Virtual Box on windows, guest-OS Debian
の設定
普段、Windows上で使用している、Virutual Boxの設定
こう使えばいいぞ!的な。
説明はdebianだが、ubuntuも。
Fedora、CentOSでも手順はおなじ。
という設定
1枚目はNATで、Linux -> 外部ネットワーク と疎通ができるもの
2枚目はホスト(Windows)側からゲスト(Linux)側への疎通(TeraTerm接続)ができるものを用意

デフォルトでは、共有フォルダは、以下のようにrootユーザ、vboxsfグループのみアクセス可能となっております。
user@vmub:/media$ ls -ld /media/sf_pc
drwxrwx--- 1 root vboxsf 4096 5月 15 18:57 /media/sf_pc
/etc/group ファイルのvboxsf の行を探して、使用可能なユーザを追加します。
自分のアカウント名が、userなら以下のようにします。
vboxsf:x:999:user
※ 数字は異なる場合があります。
以上で、/media/sf_pc にWindowsフォルダがマウントされました。
$ ln -s /media/sf_pc ~/pc
~/pcで使用可能にする。
定期的にLinux上でUbuntu/Debianなら、# aptitude upgrade、Fedora、Red-hat、Cent-OS系ならyum updateのあとに共有フォルダが使えなくなる場合があります。このときは、rootユーザで以下を実行します。
# user@vmub:/etc/network$ /media/user/VBOXADDITIONS_4.3.28_100309/VBoxLinuxAdditions.run
※ 手順6とおなじ
※ 「user」の部分は読み替えてください
Linux(ゲスト)上ににWebサーバをたててPCからアクセスする場合は、192.168.56.xでアクセス可能ですが、他のLAN上のPC側からLinux(ゲスト)PCへアクセスしたい場合、以下のようにしてVirutualBoxの「ネットワーク設定」の「アダプタ1」-「ポートフォワーディング」で設定します。
ただ、この場合は、TeraTermの[Alt+D]などで端末複製ができないなどの問題があります。
また、複数のゲストを起動して双方間で接続することもできません。
普段、Windows上で使用している、Virutual Boxの設定
こう使えばいいぞ!的な。
説明はdebianだが、ubuntuも。
Fedora、CentOSでも手順はおなじ。
- Windows上で、Linuxを使用する。主にTeraTermでアクセス。
- Linuxからは外部ネットワーク接続はできるが、外部からは入れない(Webやftpサーバとして使う場合、必要なときは入れるようにする)。
- Linux(ゲスト)側からWindows(ホスト)上のフォルダを自由にアクセスできる。
- Windows上からはLinuxフォルダへのアクセスは不可(必要ならSambaを稼働)
という設定
1.VirutualBoxの設定
2. ネットワークの設定
ネットワークカード(NIC)は2枚差しのイメージとする。1枚目はNATで、Linux -> 外部ネットワーク と疎通ができるもの
2枚目はホスト(Windows)側からゲスト(Linux)側への疎通(TeraTerm接続)ができるものを用意
3. Linux(ゲスト)とWindows(ホスト)と共有フォルダを作成する
(LinuxからWindowsファイルフォルダへフルアクセスできるようにする)
4. Windows(ホスト)側の設定は「VirutualBox Host-Only Network」と名付けられてインストールされたNICを設定する(VirutualBoxセットアップ時に勝手に作られている)

5.Linux側のセットアップは、eth0、eth1とも自動IP取得(dhcp)で構わない。
※ ubuntuは特に何もせずとも構わない。
user@vmub:/etc/network$ ifconfig
eth0 Link encap:イーサネット ハードウェアアドレス 08:00:27:ea:ee:5a
inetアドレス:10.0.2.15 ブロードキャスト:10.0.2.255 マスク:255.255.255.0
inet6アドレス: fe80::a00:27ff:feea:ee5a/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:2630 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:1405 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:1978315 (1.9 MB) TXバイト:138133 (138.1 KB)
eth1 Link encap:イーサネット ハードウェアアドレス 08:00:27:66:7e:f1
inetアドレス:192.168.56.101 ブロードキャスト:192.168.56.255 マスク:255.255.255.0
inet6アドレス: fe80::a00:27ff:fe66:7ef1/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:1644 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:1294 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:183681 (183.6 KB) TXバイト:260785 (260.7 KB)
lo Link encap:ローカルループバック
inetアドレス:127.0.0.1 マスク:255.0.0.0
inet6アドレス: ::1/128 範囲:ホスト
UP LOOPBACK RUNNING MTU:65536 メトリック:1
RXパケット:256 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:256 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:0
RXバイト:22762 (22.7 KB) TXバイト:22762 (22.7 KB)
user@vmub:/etc/network$
6.Linux上のrootユーザで、VirutualBox提供のAdditionツールをCDマウントし、VBoxLinuxAdditions.runを実行する。
7.TeraTermで接続する
Ubuntu では、
$ sudo su -
# apt-get update
# apt-get openssh-server
が必要
8.共有フォルダのパーミッション
デフォルトでは、共有フォルダは、以下のようにrootユーザ、vboxsfグループのみアクセス可能となっております。
user@vmub:/media$ ls -ld /media/sf_pc
drwxrwx--- 1 root vboxsf 4096 5月 15 18:57 /media/sf_pc
/etc/group ファイルのvboxsf の行を探して、使用可能なユーザを追加します。
自分のアカウント名が、userなら以下のようにします。
vboxsf:x:999:user
※ 数字は異なる場合があります。
以上で、/media/sf_pc にWindowsフォルダがマウントされました。
$ ln -s /media/sf_pc ~/pc
~/pcで使用可能にする。
9.その他
定期的にLinux上でUbuntu/Debianなら、# aptitude upgrade、Fedora、Red-hat、Cent-OS系ならyum updateのあとに共有フォルダが使えなくなる場合があります。このときは、rootユーザで以下を実行します。
# user@vmub:/etc/network$ /media/user/VBOXADDITIONS_4.3.28_100309/VBoxLinuxAdditions.run
※ 手順6とおなじ
※ 「user」の部分は読み替えてください
10.外部からアクセスしたい場合
Linux(ゲスト)上ににWebサーバをたててPCからアクセスする場合は、192.168.56.xでアクセス可能ですが、他のLAN上のPC側からLinux(ゲスト)PCへアクセスしたい場合、以下のようにしてVirutualBoxの「ネットワーク設定」の「アダプタ1」-「ポートフォワーディング」で設定します。
全ポート解放したい場合は、NATはやめてブリッジにする(IPアドレスがホスト以外にもゲスト分消費する)。
※ アダプター2(ホストオンリーアダプタ)を使いわないでいける方法もあります。
「アダプター1」-「ポートフォワーディング」で、ホストポート=1234(1024~65535の任意)、ゲストポート=22にし(他の項目は任意)、TeraTermでssh接続は、localhost:1234 とすればOKです。ただ、この場合は、TeraTermの[Alt+D]などで端末複製ができないなどの問題があります。
また、複数のゲストを起動して双方間で接続することもできません。
※ 外部インターネットへアクセスできない場合
Ubuntu, CentOS, Debianとも/etc/resolv.confを以下の行を加える
nameserver xxx.xxx.xxx.xxx
* xxx.xxx.xxx.xxx DNSサーバのIPv4アドレス
2015年5月15日金曜日
githubリポジトリ置き換え
Githubへ間違ったファイルを挙げてしまったとき、Github上で消去しても履歴に残るし、取り出せてしまう。
履歴もまっさらに最初からInitial Commitした状態にする方法。
Windowsコマンドラインでおこなった(TortoiseSVNが使えている環境)←ざっくり杉
適当な新規ディレクトリを作成から始める。
C:\Temp>mkdir gh
C:\Temp>cd gh
C:\Temp\gh>git clone https://github.com/hoge/hoge
C:\Temp\gh>git clone https://github.com/hoge/hoge
Cloning into 'hoge'...
remote: Counting objects: 225, done.
remote: Compressing objects: 100% (17/17), done.
rRemote: Total 225 (delta 9), reused 1 (delta 1), pack-reused 207eceiving object
s: 84% (189/225), 1.17 MiB | 1.04 MiB/s
Receiving objects: 100% (225/225), 1.99 MiB | 1.04 MiB/s, done.
Resolving deltas: 100% (55/55), done.
Checking connectivity... done.
C:\Temp\gh>dir
ドライブ C のボリューム ラベルは OS です
ボリューム シリアル番号は xxxx-xxxx です
C:\Temp\gh のディレクトリ
2015/05/15 10:07 <DIR> .
2015/05/15 10:07 <DIR> ..
2015/05/15 10:07 <DIR> hoge
0 個のファイル 0 バイト
3 個のディレクトリ 783,117,897,728 バイトの空き領域
~ここで、展開されたファイルをいじり倒す(削除や変更や追加も)~
C:\Temp\gh\hoge> rd /s/q .git ※GITリポジトリを消す(履歴も消える)
C:\Temp\gh\hoge> git init .
必要ならここで C:\Temp\gh\hoge\.git\config を編集し、以下を追加
[user]
name = oreore_name
email = oreore@mail.com
signingkey = ""
C:\Temp\gh\hoge>git add *
C:\Temp\gh\hoge>git commit -m "Initial commit"
C:\Temp\gh\hoge>git remote add origin https://github.com/hoge/hoge
C:\Temp\gh\hoge>git push origin --force
(↑2行は以下でも可)
C:\Temp\gh\hoge>git push https://github.com/hoge/hoge master --force
Username for 'https://github.com': oreore@mail.com
Password for 'https://oreore@mail.com@github.com':
Counting objects: 146, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (141/141), done.
Writing objects: 100% (146/146), 1.42 MiB | 280.00 KiB/s, done.
Total 146 (delta 17), reused 0 (delta 0)
To https://github.com/hoge/hoge
+ 16fde7d...bebf7d2 master -> master (forced update)
Githubのユーザ名とパスワードが聞かれて入力して完了
※他のブランチでの履歴をリセットしたい場合、以下で切替て、もう一度、git pushする.
C:\Temp\gh\hoge>git branch -b master
履歴もまっさらに最初からInitial Commitした状態にする方法。
Windowsコマンドラインでおこなった(TortoiseSVNが使えている環境)←ざっくり杉
適当な新規ディレクトリを作成から始める。
C:\Temp>mkdir gh
C:\Temp>cd gh
C:\Temp\gh>git clone https://github.com/hoge/hoge
C:\Temp\gh>git clone https://github.com/hoge/hoge
Cloning into 'hoge'...
remote: Counting objects: 225, done.
remote: Compressing objects: 100% (17/17), done.
rRemote: Total 225 (delta 9), reused 1 (delta 1), pack-reused 207eceiving object
s: 84% (189/225), 1.17 MiB | 1.04 MiB/s
Receiving objects: 100% (225/225), 1.99 MiB | 1.04 MiB/s, done.
Resolving deltas: 100% (55/55), done.
Checking connectivity... done.
C:\Temp\gh>dir
ドライブ C のボリューム ラベルは OS です
ボリューム シリアル番号は xxxx-xxxx です
C:\Temp\gh のディレクトリ
2015/05/15 10:07 <DIR> .
2015/05/15 10:07 <DIR> ..
2015/05/15 10:07 <DIR> hoge
0 個のファイル 0 バイト
3 個のディレクトリ 783,117,897,728 バイトの空き領域
~ここで、展開されたファイルをいじり倒す(削除や変更や追加も)~
C:\Temp\gh\hoge> rd /s/q .git ※GITリポジトリを消す(履歴も消える)
C:\Temp\gh\hoge> git init .
必要ならここで C:\Temp\gh\hoge\.git\config を編集し、以下を追加
[user]
name = oreore_name
email = oreore@mail.com
signingkey = ""
C:\Temp\gh\hoge>git add *
C:\Temp\gh\hoge>git commit -m "Initial commit"
C:\Temp\gh\hoge>git remote add origin https://github.com/hoge/hoge
C:\Temp\gh\hoge>git push origin --force
(↑2行は以下でも可)
C:\Temp\gh\hoge>git push https://github.com/hoge/hoge master --force
Username for 'https://github.com': oreore@mail.com
Password for 'https://oreore@mail.com@github.com':
Counting objects: 146, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (141/141), done.
Writing objects: 100% (146/146), 1.42 MiB | 280.00 KiB/s, done.
Total 146 (delta 17), reused 0 (delta 0)
To https://github.com/hoge/hoge
+ 16fde7d...bebf7d2 master -> master (forced update)
Githubのユーザ名とパスワードが聞かれて入力して完了
※他のブランチでの履歴をリセットしたい場合、以下で切替て、もう一度、git pushする.
2015年5月1日金曜日
削除ファイルのバックアップ
ソースコードは、Gistにあげました
バックアップでリアルタイム同期のままでは、誤って削除されたファイルまで同期して失われてしまう。
ということで削除されたファイルをバックアップするように cronからスケジュール実行するPythonバックアップスクリプトを作成した。
masterディレクトリ リアルタイム同期される(現状の状態そのものを表す)
weeklyディレクトリ 毎週1回masterの内容と同期される
deleteディレクトリ 毎晩1回weeklyにあってmasterに存在しない(消された)ファイルを保持する
rmbkup.py master weekly delete
この構文で、masterになくweeklyにあるファイルはdeleteにバックアップされる。
毎週1回のバックアップ前におこなう必要があります。(master=weeklyだとなにもおきませんので)
rmbkup.py master delete
この構文では、delete にあり、master に存在するファイルを削除する。即ち、復活されたファイルはバックアップの必要がないので削除する。この構文は週次バックアップの後に週1回おこなう。
Pythonでセールスフォース
Pythonでセールスフォースの取引先レコードを追加してみた
curlでBulkApiを叩いてやってたら大変面倒で発狂しそうになったのでPythonでいけないかやってみた。
ライブラリのインストールと修正(しなくても良い環境の人が圧倒的かな)
Pythonなんだから、MAC-OSか、Linuxなどでの例を書きたいところだが、敢えてWindowsでやってみた(Unix系は簡単なんで)Pythonバージョンは3.4.3
Python Salesforceでググってさきに見つかったsimple-salesforce 0.67.0をつかってみる。
ここからtar.gzをダウンロード
ダウンロードしたフォルダを解凍し、「simple_salesforce-0.67.0」フォルダ下でコマンドプロンプトを開き(URLバーに「cmd /f:on」と入力すればそのフォルダをカレントとしてコマンドプロンプトが開きます。-Win10な人はエクスプローラの左上メニューにズバリコマンドプロンプトがあります)
> path=%path%;c:\usr\local\python
> python setup.py build
> python setup.py install
1行目はご自身の環境に合わせて変更してください(コントロールパネルのシステム設定で変更している人は不要ですね)。
次に、ちょっとソースをいじるのでダウンロードフォルダの「simple_salesforce」をpythonインストールディレクトリの「lib\site-packages\」下へ移動する。
私の環境では、Windows環境でも、c:\usr\local\python\ にPythonがセットアップされているので、c:\usr\local\python\lib\下へ移動した。
もとのpython\lib\site-packages\simple_salesforce-0.67.0-py3.4.egg を使えないようにリネーム(これは中身は単なるZIPですが、さきほど移動してきたフォルダソースを使うようにしたいのでこうした)。
オリジナルのソースではPartnerWSDLのみしか対応できないようハードコードされているので、
simple_salesforce\api.pyを編集し以下の部分を書き換える
self.sf_version = kwargs.get('version', '29.0')
self.sandbox = kwargs.get('sandbox', False)
self.proxies = kwargs.get('proxies')
self.wsdl_type = kwargs.get('wsdl', 'partner') # or 'enterprise' <----行追加
:
# Pass along the username/password to our login helper
self.session_id, self.sf_instance = SalesforceLogin(
username=username,
password=password,
security_token=security_token,
sandbox=self.sandbox,
sf_version=self.sf_version,
proxies=self.proxies, <-------- 修正
wsdl=self.wsdl) <-------- 行追加
※ 2か所
simple_salesforce\login.pyを編集し以下の部分を書き換える
def SalesforceLogin(**kwargs):の宣言内
:
username = kwargs['username']
password = kwargs['password']
wsdl = kwargs['wsdl'] <----------- 行追加
:
soap_url = soap_url.format(domain=domain, sf_version=sf_version)
if wsdl != 'partner': <----------- 行追加
soap_url = soap_url.replace('Soap/u/', 'Soap/c/') <--- 行追加
username = escape(username)
password = escape(password)
:
:
login_soap_request_body = """<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>
<n1:login xmlns:n1="urn:{wsdl}.soap.sforce.com"> <--- 修正
<n1:username>{username}</n1:username>
<n1:password>{password}{token}</n1:password>
</n1:login>
</env:Body>
</env:Envelope>""".format(wsdl=wsdl, username=username, password=password, token=security_token) <--- 修正
※ 2か所
これで準備は整った。
ということで、
ということで、
pythonでアクセス
(先ずは上は無視してここからやってもできると思います)
接続して、取引先レコードを1件Insertして、クエリー(一覧)してみた。
C:\>python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from simple_salesforce import Salesforcefrom simple_salesforce import Salesforce
>>> sf = Salesforce(username='youraccount(email)', password='xxxxx', security_token='', wsdl='enterprise')
>>> sf.Account.create({'Name': 'ほげふがカンパニー'})
OrderedDict([('id', '001100000102TYXAA2'), ('success', True), ('errors', [])])
>>>
>>>sf.query('SELECT Id, Name FROM Account')
→結果がつらつらと表示される
SalesforceへWebブラウザでもログインし、「取引先」一覧も確認してみてください。反映されています。
標準オブジェクト名と使用メソッドについては、Salesforceサイトの「SOAP API開発者ガイド」を参照
うーん、簡単だ!これは楽です。
2015年4月10日金曜日
opensslで暗号化
# 公開鍵と秘密鍵を作成(セキュアな場所:自身のホームディレクトリとかでおこなう)
$ openssl req -x509 -nodes -newkey rsa:2048 -keyout private_key.pem -out pubkey.pem -subj '/'
ここで作成された秘密鍵(private_key.pem)は門外不出にすること(復号に必要)。
公開鍵は(pubkey.pem)ばらまいてよい(暗号に必要)
# 公開鍵で暗号化テスト(ファイルtest.binを暗号化してtest.bin.encを作る)
$ openssl smime -encrypt -aes256 -in test.bin -binary -outform DEM -out test.bin.enc pubkey.pem
# 復号(秘密鍵使用)テスト
$ openssl smime -decrypt -in test.bin.enc -binary -inform DEM -inkey private_key.pem -out test.bin
以上。
公開鍵暗号方式は共通鍵方式に比べ一般の人にはわかりづらいようですが、簡単な考え方として、公開鍵は南京錠そのもので、秘密鍵は南京錠を開く鍵と例えると解り易いかと思います。
即ち大事なものを鍵をかけて送ってもらうには南京錠を開いたまま相手に渡し、鍵をロックして送ってもらう。それを解けるのは自分だけとなります。
(追記)
と思ったら、巨大のファイルはやっぱりダメなので以下の構文で暗号/復号する方がいいかな。
鍵は別系統で渡せばよいし。
暗号(file.txtをfile.txt.encへ)
$ openssl enc -e -aes-256-cbc -in file.txt -out file.txt.enc -kfile passphrase.dat
復号(file.txt.encをout.txtへ)
$ openssl enc -d -aes-256-cbc -in file.txt.enc -out out.txt -kfile passphrase.dat
passphrase.dat は、256文字以上の適当な文字列(鍵)
$ openssl req -x509 -nodes -newkey rsa:2048 -keyout private_key.pem -out pubkey.pem -subj '/'
ここで作成された秘密鍵(private_key.pem)は門外不出にすること(復号に必要)。
公開鍵は(pubkey.pem)ばらまいてよい(暗号に必要)
# 公開鍵で暗号化テスト(ファイルtest.binを暗号化してtest.bin.encを作る)
$ openssl smime -encrypt -aes256 -in test.bin -binary -outform DEM -out test.bin.enc pubkey.pem
# 復号(秘密鍵使用)テスト
$ openssl smime -decrypt -in test.bin.enc -binary -inform DEM -inkey private_key.pem -out test.bin
以上。
公開鍵暗号方式は共通鍵方式に比べ一般の人にはわかりづらいようですが、簡単な考え方として、公開鍵は南京錠そのもので、秘密鍵は南京錠を開く鍵と例えると解り易いかと思います。
即ち大事なものを鍵をかけて送ってもらうには南京錠を開いたまま相手に渡し、鍵をロックして送ってもらう。それを解けるのは自分だけとなります。
(追記)
と思ったら、巨大のファイルはやっぱりダメなので以下の構文で暗号/復号する方がいいかな。
鍵は別系統で渡せばよいし。
暗号(file.txtをfile.txt.encへ)
$ openssl enc -e -aes-256-cbc -in file.txt -out file.txt.enc -kfile passphrase.dat
復号(file.txt.encをout.txtへ)
$ openssl enc -d -aes-256-cbc -in file.txt.enc -out out.txt -kfile passphrase.dat
passphrase.dat は、256文字以上の適当な文字列(鍵)
SaffariからChromeを開く
というか、SaffariでみているページをChromeで開きなおすには、以下の行をブックマークのURLとする。
javascript:location.href="googlechrome"+location.href.substring(4);
javascript:location.href="googlechrome"+location.href.substring(4);
Unix(Linux) Tipsいろいろ
階層下の.git以外のCソースとヘッダ群
find . -name '.git' -prune -o -type f -name '*.c' -o -name '*.h'
※ここでは何故か最後に-printをつけると.hしか表示されず、.cのみ表示される
が、.gitが表示されてしまう。(唯一のディレクトリ)
最後のprintを除くと何故か.gitだけは表示される(その下の.git下のディレクトリ群は表示されないが)
find . -name '.git' -prune -o -type f \( -name '*.c' -o -name '*.h' \) -print
とするとうまくいった。
使用例:
#!/bin/bashfor file in `find . -name "*.c* *.h" -type f`
do
echo $file
expand -t8 ${file} > ${file}.$$ && mv -f ${file}.$$ ${file} || rm -f ${file}.$$
done
回数ループをシェルスクリプトで
seq 1 9
for i in `seq 1 9`
do
echo $i
done
階層下ファイルの一括置換
xargs sed -i 's/BEFOR_STRING/REPLACE_STRING/g'これを応用し、
find . -name '.git' -prune -o -type f \( -name '*.c' -o -name '*.h' \) -print | xargs sed -i 's/\r$//'
として、改行コードをWinからUnixへ変える
実行プログラムのFullPathを得る(Win32のGetModuleFilename())
Winや、Win32 APIではそのものズバリのAPIがあるが、Linuxで。
#include "stdio.h"
#include "unistd.h"
int v = readlink("/proc/self/exe", s, sizeof(s));
if (v != -1) {
printf("FullPath=%s\n", s);
}
}
ファイルロック(排他)は、flock関数の他にシンボリックリンクファイルの作成で実現できる。
ロックファイルを作っておいて、それを指すシンボリックリンクが作成出来たら、成功、失敗したら失敗。
#include "stdio.h"
#include "unistd.h"
int v = readlink("/proc/self/exe", s, sizeof(s));
if (v != -1) {
printf("FullPath=%s\n", s);
}
}
ファイルロック(排他)は、flock関数の他にシンボリックリンクファイルの作成で実現できる。
ロックファイルを作っておいて、それを指すシンボリックリンクが作成出来たら、成功、失敗したら失敗。
Unix一般にはどうなんだろう?/procファイルシステムがあればいけるかもだが、
最近、ほかのUnixに触る機会がないので不明
2015年3月24日火曜日
armアセンブラメモ
ネゲート
mvn r0, #1 ; r0 <- -2mvn r1, #2 ; r1 <- -3
cmn r0, #1 ; if r0 == -1
bne xxx
; r0=-1
関数定義
function
func_entry:
stmfd r13!, {<registers>,r14}
:
ldmfd r13!, {<registers>,pc} ; pop and return
func_entry:
: ; r0-r3以外使わない場合
:
mov pc, lr ; return
func_entry:
: ; r0-r3以外使わない場合(Thumb使用、最近のARMはこうするべき)
:
bx lr ; return
func_entry:
stmfd r13!, {lr} ; 他の関数を呼ぶ場合
:
bl other_func
:
ldmfd r13!, {pc} ; return
mrsは、フラグレジスタ(ステータスレジスタ(s)を汎用レジスタ(r0))へ転送
msrは、その逆
mrs r0, cpsr
orr r0, r0, #0x80
msr cpsr_c, r0
レジスタ一覧
r0-r15,cpsr
spsr
※spsrは、cpsrのsaveレジスタ
- alias(レジスタ別名呼称)
r0=a1 argument:
r3=a4
r4=v1 register variable
:
r9=v6, rfp real frame pointer
r10=sl stack limit
r11=fp argument pointer
r12=ip temporary work space
r13=sp stack pointer
r14=lr link register
r15=pc program counter
例外発生時のレジスタ(svc:スーパバイザモード以外は一部のレジスタはバンク切替される)
cpsr[4:0]priority mode independent reg
0x10 - user
0x1f - system
0x13 - svc r13-14, spsr
0x17 5 abort r13-14, spsr
0x1b 6 undef r13-14, spsr
0x12 4 irq r13-14, spsr
0x11 3 fiq r8-r14, spsr
reset 1
dabort 2
↑ SVCモードではr13(sp)とr14(lr),spsrは他モードと独立して存在するということ
cpsr: bit7=irq (1=disable)
cpsr: bit6=fiq (1=disable)
exception occured.
↓
change processer mode
↓
r14 <- return (befor exception) address
↓
spsr <- cpsr cpsrはspsrに保存されるものの多重割込みを使用する場合自分でPushしたりする必要があるので注意
↓
cpsr |= 0x80 // disable irq
↓
FIQ ?
cpsr |= 0x40 // disable fiq
pc <- exception vector address
↓
transaction exception handler
//
--
movs pc, lr ; pc <- lr, spsr -> cpsr
--
割込み発生時の割込みルーチンエントリ時、戻り値lrは再開番地と異なる。以下。
undef/swi
:
movs pc, lr
fiq/irq;
:
subs pc, lr, #4
prefetch:
:
subs pc, lr, #4
dabort:
:
subs pc, lr, #8
interrupt(stack use):
sub lr, lr, #4
stmfd r13!, {r0-r7, lr}
:
ldmfd r13!, {r0-r7, pc}^
^ はmovsと同様 spsr->cpsrやってくれる
多重割込みの場合、spsrは自分でPushする必要があるから
interrupt:
msr cpsr, #(CPSR_SVC|CPSR_IRQ_BIT)
stmfd sp!, {r0-r3, ip, lr, pc} /* pcはダミー */
msr cpsr, #(CPSR_IRQ|CPSR_IRQ_BIT)
sub r0, lr, #4
mrs r1, spsr
msr cpsr, #(CPSR_SVC|CPSR_IRQ_BIT)
str r0, [sp, #0x18] /* 戻り番地をダミーpcの保存スタック位置へ */
stmfd sp!, {r1} /* spsrをスタックに保存 */
mov lr, sp /* この時点のスタックを復帰のため取得 */
:
登録:
投稿 (Atom)