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