2015年9月4日金曜日

Linux(ゲスト)から、リモートWindows共有ファイルへのアクセス

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年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

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:

2015年6月3日水曜日

Virtual Box on windows, guest-OS Debian

の設定

普段、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を実行する。





ubuntuの場合、以下手順でも可



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


















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文字以上の適当な文字列(鍵)

SaffariからChromeを開く

というか、SaffariでみているページをChromeで開きなおすには、以下の行をブックマークのURLとする。

javascript:location.href="googlechrome"+location.href.substring(4);



ソースコード閲覧用HTML作成ツール global

は、便利だが、いつも使う前に調べる。

gtags -vw
htags -sanovw
で、OK

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/bash

for 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へ変える

gccでカバレッジ

gcc --coverage
オプション付けてコンパイルリンク

実行
(cutterでもよし)

$ lcov -c -d . -o xxx.info
$ genhtml xxx.info

以上
何回も実行すると累積されていく。

gcc: 定義済みマクロ

いつもいつも悩む
デフォルトでコンパイラ内に#defineされている、gccの 定義済みマクロ

gcc -E -dM -xc /dev/null

実行プログラムの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関数の他にシンボリックリンクファイルの作成で実現できる。
ロックファイルを作っておいて、それを指すシンボリックリンクが作成出来たら、成功、失敗したら失敗。

Unix一般にはどうなんだろう?/procファイルシステムがあればいけるかもだが、
最近、ほかのUnixに触る機会がないので不明

2015年3月24日火曜日

armアセンブラメモ



ネゲート

mvn  r0, #1   ; r0 <- -2
mvn  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          /* この時点のスタックを復帰のため取得 */
    :
    

pythonでフィルタコマンド(例ではcat)

pythonでフィルタコマンド(例はcat)