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開発者ガイド」を参照


うーん、簡単だ!これは楽です。