2015年9月5日土曜日

Apacheサービス登録

【サービス登録】
httpd.exe –k install

【サービス登録解除】
httpd.exe –k uninstall

SVNのユーザ作成

以下のサイトの丸パクリです。

フリーな人生:Windowsで、SVN(Subversion) + Apache Basic認証、ユーザの追加、リポジトリの作成

【インストール】

まずSVNをインストールしてください。
インストールが終了したら、コンソールで以下のコマンドを実行し、正常に行われたかどうか確認します。
svn --version

だめだったらパスが通ってないので、環境変数のPathに追加してください。

あと、Apache2.2もインストールしておいてください。

インストールの仕方とかは他のサイトを参考にしてください。すみません。。。


【Basic認証の設定】

SVNユーザの追加は、ApacheのBasic認証を利用します。
httpd.confで指定した任意のフォルダに、同じくhttpd.confで指定した任意のファイルを作成します。

以下、Apache設定
「httpd.conf」を編集します(Apache2.2/conf下)。

#以下のモジュールのコメントアウトをはずす
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so

#以下のモジュールの記述を追加。モジュールがなければ、SVNのフォルダから探してmodulesフォルダにコピーする
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

#以下の記述を追加
<Location /svn>
  DAV svn
  SVNParentPath "d:/svn"
(※以下が認証の設定)
  AuthType Basic
  AuthName "Subversion repositories"
  AuthUserFile "C:/Apache2.2/etc/svnpasswd"  ←※1
  Require valid-user
</Location>

※1…パスワードファイルの絶対パス。任意の場所で大丈夫なので、拡張子なしの空のファイルを作っておいてください。
あとで説明するユーザの追加時に自動でできたかも。すみません、忘れました。。。

#ちなみに以下のように複数作れます
<Location /svn2>
  DAV svn
  SVNListParentPath on
  SVNParentPath "d:/svn2"

  AuthType Basic
  AuthName "Subversion repositories"
  AuthUserFile "C:/Apache2.2/etc2/svnpasswd"
  Require valid-user
</Location>
<Location /svn3>
  DAV svn
  SVNListParentPath on
  SVNParentPath "d:/svn3"

  AuthType Basic
  AuthName "Subversion repositories"
  AuthUserFile "C:/Apache2.2/etc3/svnpasswd"
  Require valid-user
</Location>


【ユーザの追加】

コマンドプロンプトを起動してください。
最初のユーザは、-cコマンドを付与して作成します。

c:> cd c:/Apache2.2/etc
c:/Apache2.2/etc>
"C:\Apache2.2\bin\htpasswd.exe" -c svnpasswd username(ユーザ名)
このあとパスワードを入力する

2人目以降は-cコマンドを付けずに実行。付けると上書きされるので。

c:/Apache2.2/etc>
"C:\Apache2.2\bin\htpasswd.exe" svnpasswd username(ユーザ名)

これでetcフォルダの下のsvnpasswdファイルに複数のユーザが追加されます。

また、ここで設定したユーザIDがコミット時などのログに利用されるAuthorになります。


【リポジトリ作成】

(1)ディレクトリを作成
mkdir D:\svn\repo

(2)リポジトリとして認識させる
svnadmin create D:\svn\repo


あとはTortoiseSVNとか、Eclipseとか、または他のツールでフォルダごとインポートします。

2015年8月25日火曜日

SVNのディレクトリを完全削除する

一度、ファイルに保存する場合

svnadmin dump 【svnディレクトリ】 | svndumpfilter exclude 【消したいsvnパス】 > 【適当なファイル名】
svnadmin create 【svnディレクトリ】
svnadmin load 【svnディレクトリ】 < 【適当なファイル名】

あらかじめ移動先を作っている場合

svnadmin dump 【svnディレクトリ】 | svndumpfilter exclude 【消したいsvnパス】 | svnadmin load 【svnディレクトリ】


svnadmin dump C:/SvnRep1 | svndumpfilter exclude /trunk/99_XXX | svnadmin load C:/SvnRep2

参照元

SVNでディレクトリを完全削除【Windows】 | grush-blog

[Subversion]巨大なリポジトリから多数の不要ファイルを恒久的に削除する方法 ・ DQNEO起業日記

2012年8月5日日曜日

Operaユーザースクリプトを有効にする

URLに「opera:config#UserPrefs|UserJavaScript」と入力し、「User JavaScript」「User JavaScript on HTTPS」をチェックし、「User JavaScript File」にJSファイルを保存しているフォルダを指定する。
設定後はブラウザの再起動が必要。

20120805_202500_001

2012年7月29日日曜日

FirefoxでYahooのトップページを表示すると重い

FirefoxとFlashプレーヤの相性が悪いことが原因らしい
Flashプレーヤの設定ファイルmms.cfgを編集してオプションを追加すると、スムーズに表示できるようになる

mms.cfgの場所
32bit版 Vista/7の場合
C:\windows\system32\macromed\flash
64bit版 Vista/7の場合
C:\windows\syswow64\macromed\flash

追加するオプション
ProtectedMode=0

参照サイト
FirefoxでFlash、Youtubeが再生出来ない問題2012年6月

2012年6月18日月曜日

[c#]Twitterクライアントを作成するためのリンク集

以下のサイトを参考にすると、作成できるかも。昔はBASIC認証でもアクセスできていたみたいだけ、OAuth認証というものを使わなければアクセスできなくなったらしい。結構難しそう・・・。

C#でOAuthでTwitter - nojimaの日記

Twitterを活用したプログラムをC#で作成しよう

Twitterに自分で作成したアプリケーションを登録する (2012年3月版)

twitterizer(http://code.google.com/p/twitterizer/)

Twitterizer(http://www.twitterizer.net/)

30分で誰でも作れるTwitter Bot開発・運用手順 – Ruby Twitter bot

リンク先の①、②を組み合わせて1分おきに、タイムラインをコンソール出力するプログラムを作ってみました。
初回起動時に保存される設定ファイルは「C:\Users\<ユーザーID>\AppData\Local\ConsoleTwitter」に保存されるようです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;
using System.Security.Cryptography;

namespace ConsoleTwitter
{
class Auth {
const string REQUEST_TOKEN_URL = "https://twitter.com/oauth/request_token";
const string ACCESS_TOKEN_URL = "https://twitter.com/oauth/access_token";
const string AUTHORIZE_URL = "https://twitter.com/oauth/authorize";

private Random random = new Random();

public string ConsumerKey { get; private set; }
public string ConsumerSecret { get; private set; }
public string RequestToken { get; private set; }
public string RequestTokenSecret { get; private set; }
public string AccessToken { get; private set; }
public string AccessTokenSecret { get; private set; }
public string UserId { get; private set; }
public string ScreenName { get; private set; }

public Auth(string consumerKey, string consumerSecret) {
ServicePointManager.Expect100Continue = false;
ConsumerKey = consumerKey;
ConsumerSecret = consumerSecret;
}

public Auth(string consumerKey, string consumerSecret, string accessToken, string accessTokenSecret, string userId, string screenName) {
ServicePointManager.Expect100Continue = false;
ConsumerKey = consumerKey;
ConsumerSecret = consumerSecret;
AccessToken = accessToken;
AccessTokenSecret = accessTokenSecret;
UserId = userId;
ScreenName = screenName;
}

public void GetRequestToken() {
SortedDictionary parameters = GenerateParameters("");
string signature = GenerateSignature("", "GET", REQUEST_TOKEN_URL, parameters);
parameters.Add("oauth_signature", UrlEncode(signature));
string response = HttpGet(REQUEST_TOKEN_URL, parameters);
Dictionary dic = ParseResponse(response);
RequestToken = dic["oauth_token"];
RequestTokenSecret = dic["oauth_token_secret"];
}

public string GetAuthorizeUrl() {
return AUTHORIZE_URL + "?oauth_token=" + RequestToken;
}

public void GetAccessToken(string pin) {
SortedDictionary parameters = GenerateParameters(RequestToken);
parameters.Add("oauth_verifier", pin);
string signature = GenerateSignature(RequestTokenSecret, "GET", ACCESS_TOKEN_URL, parameters);
parameters.Add("oauth_signature", UrlEncode(signature));
string response = HttpGet(ACCESS_TOKEN_URL, parameters);
Dictionary dic = ParseResponse(response);
AccessToken = dic["oauth_token"];
AccessTokenSecret = dic["oauth_token_secret"];
UserId = dic["user_id"];
ScreenName = dic["screen_name"];
}

public string Get(string url, IDictionary parameters) {
SortedDictionary parameters2 = GenerateParameters(AccessToken);
foreach (var p in parameters)
parameters2.Add(p.Key, p.Value);
string signature = GenerateSignature(AccessTokenSecret, "GET", url, parameters2);
parameters2.Add("oauth_signature", UrlEncode(signature));
return HttpGet(url, parameters2);
}

public string Post(string url, IDictionary parameters) {
SortedDictionary parameters2 = GenerateParameters(AccessToken);
foreach (var p in parameters)
parameters2.Add(p.Key, p.Value);
string signature = GenerateSignature(AccessTokenSecret, "POST", url, parameters2);
parameters2.Add("oauth_signature", UrlEncode(signature));
return HttpPost(url, parameters2);
}

private string HttpGet(string url, IDictionary parameters) {
WebRequest req = WebRequest.Create(url + '?' + JoinParameters(parameters));
WebResponse res = req.GetResponse();
Stream stream = res.GetResponseStream();
StreamReader reader = new StreamReader(stream);
string result = reader.ReadToEnd();
reader.Close();
stream.Close();
return result;
}

string HttpPost(string url, IDictionary parameters) {
byte[] data = Encoding.ASCII.GetBytes(JoinParameters(parameters));
WebRequest req = WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = data.Length;
Stream reqStream = req.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader reader = new StreamReader(resStream, Encoding.UTF8);
string result = reader.ReadToEnd();
reader.Close();
resStream.Close();
return result;

}

private Dictionary ParseResponse(string response) {
Dictionary result = new Dictionary();
foreach (string s in response.Split('&')) {
int index = s.IndexOf('=');
if (index == -1)
result.Add(s, "");
else
result.Add(s.Substring(0, index), s.Substring(index + 1));
}
return result;
}

private string JoinParameters(IDictionary parameters) {
StringBuilder result = new StringBuilder();
bool first = true;
foreach (var parameter in parameters) {
if (first)
first = false;
else
result.Append('&');
result.Append(parameter.Key);
result.Append('=');
result.Append(parameter.Value);
}
return result.ToString();
}

private string GenerateSignature(string tokenSecret, string httpMethod, string url, SortedDictionary parameters) {
string signatureBase = GenerateSignatureBase(httpMethod, url, parameters);
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = Encoding.ASCII.GetBytes(UrlEncode(ConsumerSecret) + '&' + UrlEncode(tokenSecret));
byte[] data = System.Text.Encoding.ASCII.GetBytes(signatureBase);
byte[] hash = hmacsha1.ComputeHash(data);
return Convert.ToBase64String(hash);
}

private string GenerateSignatureBase(string httpMethod, string url, SortedDictionary parameters) {
StringBuilder result = new StringBuilder();
result.Append(httpMethod);
result.Append('&');
result.Append(UrlEncode(url));
result.Append('&');
result.Append(UrlEncode(JoinParameters(parameters)));
return result.ToString();
}

private SortedDictionary GenerateParameters(string token) {
SortedDictionary result = new SortedDictionary();
result.Add("oauth_consumer_key", ConsumerKey);
result.Add("oauth_signature_method", "HMAC-SHA1");
result.Add("oauth_timestamp", GenerateTimestamp());
result.Add("oauth_nonce", GenerateNonce());
result.Add("oauth_version", "1.0");
if (!string.IsNullOrEmpty(token))
result.Add("oauth_token", token);
return result;
}

public string UrlEncode(string value) {
string unreserved = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
StringBuilder result = new StringBuilder();
byte[] data = Encoding.UTF8.GetBytes(value);
foreach (byte b in data) {
if (b < 0x80 && unreserved.IndexOf((char)b) != -1)
result.Append((char)b);
else
result.Append('%' + String.Format("{0:X2}", (int)b));
}
return result.ToString();
}

private string GenerateNonce() {
string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder result = new StringBuilder(8);
for (int i = 0; i < 8; ++i)
result.Append(letters[random.Next(letters.Length)]);
return result.ToString();
}

private string GenerateTimestamp() {
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
}

class TweetEntity
{
public string UserName = "";
public string Tweet = "";
public string PostedTime = "";
public override string ToString()
{
return UserName + "\r\n" + Tweet + "\r\n" + PostedTime + "\r\n";
}
}

class Program
{

const string CONSUMER_KEY = "hogehogehogehogehoge";
const string CONSUMER_SECRET = "fugafugafugafugafugafugafugafuga";
static readonly string LOG_FILE = AppDomain.CurrentDomain.BaseDirectory.Substring(0,
AppDomain.CurrentDomain.BaseDirectory.LastIndexOf("bin")) + "bin\\ConsoleTwitter.log";

static void Main(string[] args)
{

int timespan = 60000;

List prevTweetList = new List();
List currTweetList = new List();

for (; ; )
{
try
{
currTweetList = GetTweet();
DisplayTweet(prevTweetList, currTweetList);
prevTweetList = currTweetList;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
System.Threading.Thread.Sleep(timespan);
}

}

private static List GetTweet()
{

List tweetList = new List();

Auth auth = GetAuth();

// タイムラインから50件取得してみる
Dictionary parameters = new Dictionary();
parameters.Add("count", "50");
string pagedata = auth.Get("http://twitter.com/statuses/home_timeline.xml", parameters);
//Debug(pagedata);

string tag = "status";

XmlDocument xdoc = new XmlDocument();

xdoc.LoadXml(pagedata);

XmlElement root = xdoc.DocumentElement;

XmlNodeList mylist = root.GetElementsByTagName(tag);

for (int i = 0; i < mylist.Count; i++)
{

TweetEntity tweet = new TweetEntity();

tweet.UserName = mylist[i].ChildNodes[11].ChildNodes[1].InnerText; // User name

tweet.Tweet = mylist[i].ChildNodes[2].InnerText; // Tweet

tweet.PostedTime = mylist[i].ChildNodes[0].InnerText; // posted time

tweetList.Add(tweet);

}

return tweetList;
}

private static void DisplayTweet(List prevTweetList, List currTweetList)
{
StreamWriter wr = new StreamWriter(LOG_FILE, true, Encoding.GetEncoding("Shift_JIS"));
foreach (TweetEntity currTweet in currTweetList)
{
bool isNew = true;
foreach (TweetEntity prevTweet in prevTweetList)
{
if (prevTweet.ToString() == currTweet.ToString())
{
isNew = false;
break;
}
}
if (isNew)
{
Console.WriteLine(currTweet.ToString());
wr.WriteLine(currTweet.ToString());
}

}
wr.Close();
}

private static Auth GetAuth()
{
Auth auth;

var settings = ConsoleTwitter.Properties.Settings.Default;

if (string.IsNullOrEmpty((string)settings["AccessToken"]))
{

auth = new Auth(CONSUMER_KEY, CONSUMER_SECRET);

// リクエストトークンを取得する
auth.GetRequestToken();

// ユーザーにRequestTokenを認証してもらう
Console.WriteLine("次のURLにアクセスして暗証番号を取得してください:");
Console.WriteLine(auth.GetAuthorizeUrl());
Console.Write("暗証番号:");
string pin = Console.ReadLine().Trim();

// アクセストークンを取得する
auth.GetAccessToken(pin);

// 結果を表示する
Console.WriteLine("AccessToken: " + auth.AccessToken);
Console.WriteLine("AccessTokenSecret: " + auth.AccessTokenSecret);
Console.WriteLine("UserId: " + auth.UserId);
Console.WriteLine("ScreenName: " + auth.ScreenName);

// アクセストークンを設定ファイルに保存する
settings["AccessToken"] = auth.AccessToken;
settings["AccessTokenSecret"] = auth.AccessTokenSecret;
settings["UserId"] = auth.UserId;
settings["ScreenName"] = auth.ScreenName;
settings.Save();
}
else
{
// 設定ファイルから読み込む
auth = new Auth(CONSUMER_KEY, CONSUMER_SECRET,
(string)settings["AccessToken"], (string)settings["AccessTokenSecret"],
(string)settings["UserId"], (string)settings["ScreenName"]);
}
return auth;
}

private static void Debug(string s)
{
StreamWriter wr = new StreamWriter(LOG_FILE + ".DEBUG.txt", true, Encoding.GetEncoding("Shift_JIS"));
wr.WriteLine(s);
wr.Close();
}

}
}

2012年5月30日水曜日

Windows Live Writerを使ってみる

ブログを書くのに神的によいそうなので、使ってみる。
すべてのプログラム-Windows Live-Windows Writerを選択する。
使用許諾はOKする。
Windows Live Writerの構成では「次へ」を選択する。
20120530 Windows Live Writer 1
20120530 Windows Live Writer 1 posted by (C)てる

ブログサービスの選択では「他のサービス」を選択する。
20120530 Windows Live Writer 2
20120530 Windows Live Writer 2 posted by (C)てる

ブログアカウントの追加で、ブログ情報を入力する。
20120530 Windows Live Writer 3
20120530 Windows Live Writer 3 posted by (C)てる

ここがすごいところなのだが、上記で「次へ」とした後に、ブログに接続して、情報を取得してきてくれる。ブログの選択はそのまま「次へ」。
20120530 Windows Live Writer 4
20120530 Windows Live Writer 4 posted by (C)てる

ここも「次へ」でよい。
20120530 Windows Live Writer 5
20120530 Windows Live Writer 5 posted by (C)てる

以下がブログ作成画面で、タイトルと本文を少し入力したところ。
20120530 Windows Live Writer 6
20120530 Windows Live Writer 6 posted by (C)てる

機能的には、

  • 複数のブログに対応している
  • エディタ上での編集、プレビュー(テンプレートも含んでのプレビュー)、HTMLの直接編集が可能
  • エディタ上での編集は、フォントスタイル、段落、リンク等の挿入、表の挿入などができる
  • 新規の投稿、投稿されたものの修正、削除などができる
など、なかなかよさそうである。