<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/&quot;CkUMSX09eSp7ImA9WhdbE0Q.&quot;'><id>tag:blogger.com,1999:blog-5111958154917314907</id><updated>2011-10-12T12:31:28.361+09:00</updated><title>ベンチャー奮闘記！</title><subtitle type='html'>"Nothing ventured, nothing gained!"</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://shoichi-lifestyle.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default?redirect=false&amp;v=2'/><link rel='alternate' type='text/html' href='http://shoichi-lifestyle.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>y.shoichi</name><uri>http://www.blogger.com/profile/16378008406355405546</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry gd:etag='W/&quot;CkUMSX0ycCp7ImA9WhdbE0Q.&quot;'><id>tag:blogger.com,1999:blog-5111958154917314907.post-5369266116774233152</id><published>2011-10-12T12:28:00.001+09:00</published><updated>2011-10-12T12:31:28.398+09:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2011-10-12T12:31:28.398+09:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='Rest'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title>REST for Android</title><content type='html'>AndroidでREST通信をするクラス。&lt;br /&gt;
HTTPS通信にも対応済み。&lt;br /&gt;
&lt;br /&gt;
JSONICライブラリなどと併用すると簡単にREST通信可能。&lt;br /&gt;
&lt;br /&gt;
JSONIC&lt;br /&gt;
&lt;a href="http://jsonic.sourceforge.jp/"&gt;http://jsonic.sourceforge.jp/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;RestConnection クラス&lt;/b&gt;&lt;br /&gt;
&lt;pre name="code" class="java"&gt;package jp.tryden.net;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import jp.tryden.dreamowner.util.AndroidUtil;

/**
 * RestConnection
 * 
 * The MIT License (MIT)
 * Copyright (c) 2011 Yoshida Shoichi
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the 
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to 
 * permit persons to whom the Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 */

public class RestConnection {

 // Content Type
 public static final String CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded";
 public static final String CONTENT_TYPE_TEXT_PLAIN = "text/plain";
 public static final String CONTENT_TYPE_TEXT_HTML = "text/html";
 public static final String CONTENT_TYPE_APPLICATION_JSON = "application/json";
 public static final String CONTENT_TYPE_APPLICATION_XML = "application/xml";
 public static final String CONTENT_TYPE_APPLICATION_ATOM = "application/atom+xml";
 public static final String CONTENT_TYPE_APPLICATION_ZIP = "application/zip";
 public static final String CONTENT_TYPE_IMAGE_JPEG = "image/jpeg";
 public static final String CONTENT_TYPE_IMAGE_PNG = "image/png";
 public static final String CONTENT_TYPE_IMAGE_GIF = "image/gif";
 // Charset
 public static final String CHARSET_UTF8 = "UTF-8";
 public static final String CHARSET_EUC_JP = "EUC_JP";
 public static final String CHARSET_SHIFT_JIS = "SJIS";
 public static final String CHARSET_MS932 = "MS932";
 // Default settings
 public static final String DEFAULT_CONTENT_TYPE = CONTENT_TYPE_FORM_URLENCODED;
 public static final String DEFAULT_CHARSET = CHARSET_UTF8;
 public static final int TIMEOUT = 25;

 protected HttpURLConnection conn;
 protected String date;
 protected String contentType;
 protected String charset;

 static {
  // set the identification of the client
  // System.setProperty("http.agent", System.getProperty("user.name") +
  // " (from NetBeans IDE)");
  System.setProperty("http.agent", AndroidUtil.getUserAgent());
  System.setProperty("http.keepAlive", "false");
 }

 /** Creates a new instance of RestConnection */
 public RestConnection(String baseUrl) {
  this(baseUrl, null, null, TIMEOUT);
 }

 /** Creates a new instance of RestConnection */
 public RestConnection(String baseUrl, int timeout) {
  this(baseUrl, null, null, timeout);
 }

 /** Creates a new instance of RestConnection */
 public RestConnection(String baseUrl, Map&lt;String, String&gt; params) {
  this(baseUrl, null, params, TIMEOUT);
 }

 /** Creates a new instance of RestConnection */
 public RestConnection(String baseUrl, Map&lt;String, String&gt; params,
   int timeout) {
  this(baseUrl, null, params, timeout);
 }

 /** Creates a new instance of RestConnection */
 public RestConnection(String baseUrl, Map&lt;String, String&gt; pathParams,
   Map&lt;String, String&gt; params) {
  this(baseUrl, pathParams, params, TIMEOUT);
 }

 /** Creates a new instance of RestConnection */
 public RestConnection(String baseUrl, Map&lt;String, String&gt; pathParams,
   Map&lt;String, String&gt; params, int timeout) {
  try {
   String urlStr = baseUrl;
   if (pathParams != null &amp;&amp; pathParams.size() &gt; 0) {
    urlStr = replaceTemplateParameters(baseUrl, pathParams);
   }

   URL url = new URL(encodeUrl(urlStr, params));
   if (url.getProtocol().toLowerCase().equals("https")) {
    trustAllHosts();
    HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
    https.setHostnameVerifier(DO_NOT_VERIFY);
    conn = https;
   } else {
    conn = (HttpURLConnection) url.openConnection();
   }
   conn.setDoInput(true);
   conn.setDoOutput(true);
   conn.setUseCaches(false);
   conn.setDefaultUseCaches(false);
   conn.setAllowUserInteraction(true);
   conn.setReadTimeout(timeout * 1000); // ms

   SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
   date = format.format(new Date());
   conn.setRequestProperty("Date", date);
  } catch (Exception ex) {
   Logger.getLogger(RestConnection.class.getName()).log(Level.SEVERE, null, ex);
  }
 }

 public void setAuthenticator(Authenticator authenticator) {
  Authenticator.setDefault(authenticator);
 }

 public String getDate() {
  return date;
 }

 public RestResponse get() throws IOException {
  return get(null);
 }

 public RestResponse get(Map&lt;String, String&gt; headers) throws IOException {
  conn.setRequestMethod("GET");
  return connect(headers, null);
 }

 public RestResponse head() throws IOException {
  return get(null);
 }

 public RestResponse head(Map&lt;String, String&gt; headers) throws IOException {
  conn.setRequestMethod("HEAD");
  return connect(headers, null);
 }

 public RestResponse put(Map&lt;String, String&gt; headers) throws IOException {
  return put(headers, (InputStream) null);
 }

 public RestResponse put(Map&lt;String, String&gt; headers, String data)
   throws IOException {
  InputStream is = null;
  if (data != null) {
   is = new ByteArrayInputStream(
     data.getBytes((charset != null) ? charset : DEFAULT_CHARSET));
  }
  return put(headers, is);
 }

 public RestResponse put(Map&lt;String, String&gt; headers, InputStream is)
   throws IOException {
  conn.setRequestMethod("PUT");
  return connect(headers, is);
 }

 public RestResponse post(Map&lt;String, String&gt; headers) throws IOException {
  return post(headers, (InputStream) null);
 }

 public RestResponse post(Map&lt;String, String&gt; headers, String data)
   throws IOException {
  InputStream is = null;
  if (data != null) {
   is = new ByteArrayInputStream(
     data.getBytes((charset != null) ? charset : DEFAULT_CHARSET));
  }
  return post(headers, is);
 }

 public RestResponse post(Map&lt;String, String&gt; headers, InputStream is)
   throws IOException {
  conn.setRequestMethod("POST");
  return connect(headers, is);
 }

 /**
  * Used by post method whose contents are like form input
  */
 public RestResponse post(Map&lt;String, String&gt; headers,
   Map&lt;String, String&gt; params) throws IOException {
  conn.setRequestMethod("POST");
  String data = encodeParams(params);
  return connect(
    headers,
    new ByteArrayInputStream(
      data.getBytes((charset != null) ? charset
        : DEFAULT_CHARSET)));
 }

 public RestResponse delete(Map&lt;String, String&gt; headers) throws IOException {
  conn.setRequestMethod("DELETE");
  return connect(headers, null);
 }

 public void setContentType(String contentType) {
  this.contentType = contentType;
 }

 public String getContentType() {
  if (contentType == null) {
   contentType = DEFAULT_CONTENT_TYPE;
  }
  return contentType;
 }

 public void setCharset(String charset) {
  this.charset = charset;
 }

 public String getCharset() {
  if (charset == null) {
   charset = DEFAULT_CHARSET;
  }
  return charset;
 }

 public int getTimeout() {
  if (conn != null) {
   return conn.getReadTimeout();
  }
  return -1;
 }

 public void setTimeout(int timeout) {
  if (conn != null) {
   conn.setReadTimeout(timeout);
  }
 }

 /**
  * @param baseUrl
  * @param params
  * @return response
  */
 @SuppressWarnings("finally")
 protected RestResponse connect(Map&lt;String, String&gt; headers, InputStream data)
   throws IOException {
  try {
   // Send data
   setHeaders(headers);
   
   // Content-Type
            conn.setRequestProperty("Content-Type", (contentType != null) ? contentType : DEFAULT_CONTENT_TYPE);
   
   String method = conn.getRequestMethod();

   byte[] buffer = new byte[1024];
   int count = 0;
   
   if (method.equals("PUT") || method.equals("POST")) {
    if (data != null) {
     conn.setDoOutput(true);
     OutputStream os = conn.getOutputStream();

     while ((count = data.read(buffer)) != -1) {
      os.write(buffer, 0, count);
     }
     os.flush();
    }
   }

   RestResponse response = new RestResponse();
   InputStream is = conn.getInputStream();

   while ((count = is.read(buffer)) != -1) {
    response.write(buffer, 0, count);
   }

   response.setResponseCode(conn.getResponseCode());
   response.setResponseMessage(conn.getResponseMessage());
   response.setContentType(conn.getContentType());
   response.setContentEncoding(conn.getContentEncoding());
   response.setLastModified(conn.getLastModified());

   return response;
  } catch (Exception e) {
   String errMsg = "Cannot connect to :" + conn.getURL();
   try {
    BufferedReader rd = new BufferedReader(new InputStreamReader(
      conn.getErrorStream()));
    String line;
    StringBuilder buf = new StringBuilder();
    while ((line = rd.readLine()) != null) {
     buf.append(line);
     buf.append('\n');
    }
    errMsg = buf.toString();
   } catch (Exception ex) {
   } finally {
    throw new IOException(errMsg);
   }
  }
 }

 protected String replaceTemplateParameters(String baseUrl,
   Map&lt;String, String&gt; pathParams) {
  String url = baseUrl;
  if (pathParams != null) {
   Iterator&lt;string&gt; it = pathParams.keySet().iterator();
   while (it.hasNext()) {
    String key = (String) it.next();
    String value = (String) pathParams.get(key);
    if (value == null) {
     value = "";
    }
    url = url.replace(key, value);
   }
  }
  return url;
 }

 protected String encodeUrl(String baseUrl, Map&lt;String, String&gt; params) {
  String encodedParams = encodeParams(params);
  if (encodedParams.length() &gt; 0) {
   encodedParams = "?" + encodedParams;
  }
  return baseUrl + encodedParams;
 }

 protected String encodeParams(Map&lt;String, String&gt; params) {
  String p = "";
  if (params != null) {
   Iterator&lt;string&gt; it = params.keySet().iterator();
   while (it.hasNext()) {
    String key = (String) it.next();
    String value = (String) params.get(key);
    if (value != null) {
     try {
      p += key + "=" + URLEncoder.encode(value,
       (charset != null) ? charset : DEFAULT_CHARSET) + "&amp;";
     } catch (UnsupportedEncodingException ex) {
      Logger.getLogger(RestConnection.class.getName()).log(
        Level.SEVERE, null, ex);
     }
    }
   }
   if (p.length() &gt; 0) {
    p = p.substring(0, p.length() - 1);
   }
  }
  return p;
 }

 protected void setHeaders(Map&lt;String, String&gt; headers) {
  if (headers != null) {
   Iterator&lt;string&gt; it = headers.keySet().iterator();
   while (it.hasNext()) {
    String key = (String) it.next();
    String value = (String) headers.get(key);
    conn.setRequestProperty(key, value);
   }
  }
 }

 //////////////////////////////////////////////////////////////////////////////////
 final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
  public boolean verify(String hostname, SSLSession session) {
   return true;
  }
 };

 private static void trustAllHosts() {
  // Create a trust manager that does not validate certificate chains
  TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
   public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    return new java.security.cert.X509Certificate[] {};
   }

   public void checkClientTrusted(X509Certificate[] chain,
     String authType) throws CertificateException {
   }

   public void checkServerTrusted(X509Certificate[] chain,
     String authType) throws CertificateException {
   }
  } };

  // Install the all-trusting trust manager
  try {
   SSLContext sc = SSLContext.getInstance("TLS");
   sc.init(null, trustAllCerts, new java.security.SecureRandom());
   HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;RestResponse&lt;/b&gt;&lt;br /&gt;
&lt;pre name="code" class="java"&gt;/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jp.tryden.net

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * RestResponse
 * 
 * The MIT License (MIT)
 * Copyright (c) 2011 Yoshida Shoichi
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the 
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to 
 * permit persons to whom the Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 */
public class RestResponse {

    private ByteArrayOutputStream os;
    private String contentType = "text/plain";
    private String contentEncoding;

 private int responseCode;
    private String responseMsg;
    private long lastModified;

    public RestResponse() {
        os = new ByteArrayOutputStream();
    }

    public RestResponse(byte[] bytes) throws IOException {
        this();

        byte[] buffer = new byte[1024];
        int count = 0;
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        while ((count = bis.read(buffer)) != -1) {
            write(buffer, 0, count);
        }
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentEncoding(String contentEncoding) {
        this.contentEncoding = contentEncoding;
    }
    
    public String getContentEncoding() {
  return contentEncoding;
 }

    public void setResponseMessage(String msg) {
        this.responseMsg = msg;
    }

    public String getResponseMessage() {
        return responseMsg;
    }

    public void setResponseCode(int code) {
        this.responseCode = code;
    }

    public int getResponseCode() {
        return responseCode;
    }

    public void setLastModified(long lastModified) {
        this.lastModified = lastModified;
    }

    public long getLastModified() {
        return lastModified;
    }

    public void write(byte[] bytes, int start, int length) {
        os.write(bytes, start, length);
    }

    public byte[] getDataAsByteArray() {
        return os.toByteArray();
    }

    public String getDataAsString() {
        try {
            return os.toString("UTF-8");
        } catch (Exception ex) {
            Logger.getLogger(RestConnection.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    public OutputStream getOutputStream() {
        return os;
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;使い方&lt;/b&gt;&lt;br /&gt;
Googleの短縮URL（goo.gl）を例にしてみる。&lt;br /&gt;
JSONICライブラリを使用しているので、テストするにはjarファイルをリンクさせておく。&lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code" class="java"&gt;package jp.tryden.test;

import java.util.logging.Logger;
import jp.tryden.saas.RestConnection;
import jp.tryden.saas.RestResponse;
import net.arnx.jsonic.JSON;

public class GooglAPI {

    private static final Logger log = Logger.getLogger(GooglAPI.class.getName());
    public static final String GOOGL_API_HOST = "https://www.googleapis.com/urlshortener/v1/url";

    public static class Request {

        public String longUrl;
    }

    public static class Response {

        public String kind;
        public String id;
        public String longUrl;
    }

    public static String getShortUrl(String url) {
        Response data = getData(url);
        if (data != null) {
            return data.id;
        }
        return null;
    }

    public static Response getData(String url) {
        Request req = new Request();
        req.longUrl = url;

        RestConnection conn = new RestConnection(GOOGL_API_HOST);
        try {
            String jsonRequest = JSON.encode(req);
            conn.setContentType(RestConnection.CONTENT_TYPE_APPLICATION_JSON);
            RestResponse response = conn.post(null, jsonRequest);
            String jsonResponse = response.getDataAsString();
            return JSON.decode(jsonResponse, Response.class);
        } catch (Exception e) {
            log.warning(e.getMessage());
            return null;
        }

    }
 
 public static void main(String[] args) {
     String longUrl = "http://www.google.co.jp/";
  String shortUrl = getShortUrl(longUrl);
  System.out.println("Result: " +shortUrl);
 }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5111958154917314907-5369266116774233152?l=shoichi-lifestyle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shoichi-lifestyle.blogspot.com/feeds/5369266116774233152/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2011/10/rest-for-android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/5369266116774233152?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/5369266116774233152?v=2'/><link rel='alternate' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2011/10/rest-for-android.html' title='REST for Android'/><author><name>y.shoichi</name><uri>http://www.blogger.com/profile/16378008406355405546</uri><email>noreply@blogger.com</email></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;CkYMRXg8eyp7ImA9WxBQEEU.&quot;'><id>tag:blogger.com,1999:blog-5111958154917314907.post-835790581887104663</id><published>2010-01-10T07:20:00.008+09:00</published><updated>2010-01-10T08:36:24.673+09:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2010-01-10T08:36:24.673+09:00</app:edited><title>CStringを分割してみる(Split)</title><content type='html'>MFCのCStringにSplit関数が無いので、分割できるヘルパークラスを作成してみた。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++"&gt;&lt;br /&gt;#pragma once&lt;br /&gt;&lt;br /&gt;#include &amp;lt;afxcoll.h&amp;gt;&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;class CStringSplit&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; CStringSplit()  {}&lt;br /&gt; virtual ~CStringSplit() {}&lt;br /&gt;&lt;br /&gt; CStringArray &amp;Split(const CString &amp;src, TCHAR sep)&lt;br /&gt; {&lt;br /&gt;  CString str = src;&lt;br /&gt;  UINT    nPrev;&lt;br /&gt;  UINT    nLength = src.GetLength();&lt;br /&gt;  LPTSTR  lpStr   = static_cast&amp;lt;LPTSTR&amp;gt;(str.GetBuffer());&lt;br /&gt;&lt;br /&gt;  m_WordList.RemoveAll();&lt;br /&gt;  nPrev = 0;&lt;br /&gt;&lt;br /&gt;  for (UINT i = 0; i &lt; nLength; i++)&lt;br /&gt;  {&lt;br /&gt;   if (lpStr[i] == sep)&lt;br /&gt;   {&lt;br /&gt;    CString word;&lt;br /&gt;    UINT    nWordLength = i - nPrev;&lt;br /&gt;&lt;br /&gt;    if (nWordLength &gt; 0)&lt;br /&gt;    {&lt;br /&gt;     word.SetString(&amp;lpStr[nPrev], nWordLength);&lt;br /&gt;     m_WordList.Add(word);&lt;br /&gt;     nPrev = i + 1;//&lt;br /&gt;     i++;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (nPrev &gt; 0)&lt;br /&gt;  {&lt;br /&gt;   CString word;&lt;br /&gt;   UINT    nWordLength = nLength - nPrev;&lt;br /&gt;&lt;br /&gt;   if (nWordLength &gt; 0)&lt;br /&gt;   {&lt;br /&gt;    word.SetString(&amp;lpStr[nPrev], nWordLength);&lt;br /&gt;    m_WordList.Add(word);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  str.ReleaseBuffer();&lt;br /&gt;&lt;br /&gt;  return m_WordList;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; CStringArray m_WordList;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;◯使い方&lt;br /&gt;&lt;pre name="code" class="c++"&gt;&lt;br /&gt;CString str = _T("abc,123,def,456");&lt;br /&gt;CStringArray ary;&lt;br /&gt;CStringSplit s;&lt;br /&gt;&lt;br /&gt;// CSV形式&lt;br /&gt;ary = s.Split(str, _T(","));&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &lt; ary.GetSize(); i++)&lt;br /&gt;{&lt;br /&gt;    AfxMessageBox(ary[i]);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5111958154917314907-835790581887104663?l=shoichi-lifestyle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shoichi-lifestyle.blogspot.com/feeds/835790581887104663/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2010/01/cstringsplite.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/835790581887104663?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/835790581887104663?v=2'/><link rel='alternate' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2010/01/cstringsplite.html' title='CStringを分割してみる(Split)'/><author><name>y.shoichi</name><uri>http://www.blogger.com/profile/16378008406355405546</uri><email>noreply@blogger.com</email></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;AkMGRH04cCp7ImA9WxBQE00.&quot;'><id>tag:blogger.com,1999:blog-5111958154917314907.post-7050384108966471397</id><published>2009-12-22T00:38:00.003+09:00</published><updated>2010-01-13T00:00:25.338+09:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2010-01-13T00:00:25.338+09:00</app:edited><title>CArrayをソートする</title><content type='html'>MFCのCArrayを拡張したCSortArrayクラス。&lt;br /&gt;&lt;br /&gt;CArrayに入れたデータをクイックソートすることが可能。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++"&gt;&lt;br /&gt;#pragma once&lt;br /&gt;&lt;br /&gt;#include &amp;lt;afxtempl.h&amp;gt;&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;template &amp;lt;class TYPE, class ARG_TYPE = TYPE&amp;gt; &lt;br /&gt;class CSortArray : public CArray &amp;lt;TYPE, ARG_TYPE&amp;gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; CSortArray() {}&lt;br /&gt; virtual ~CSortArray() {}&lt;br /&gt;&lt;br /&gt; void QuickSort(BOOL bAscending = TRUE);&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; BOOL doQuickSort(TYPE *pArr, int nSize, BOOL bAscending = TRUE);&lt;br /&gt; void doQuickSortRecursive(TYPE *pArr, int d, int h, BOOL bAscending);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;template &amp;lt;class TYPE, class ARG_TYPE&amp;gt; &lt;br /&gt;inline void CSortArray&amp;lt;TYPE, ARG_TYPE&amp;gt;::doQuickSortRecursive(TYPE *pArr, int d, int h, BOOL bAscending)&lt;br /&gt;{&lt;br /&gt; int  i, j, pvt;&lt;br /&gt; TYPE src, tmp;&lt;br /&gt;&lt;br /&gt; i   = h;&lt;br /&gt; j   = d;&lt;br /&gt; pvt = static_cast&amp;lt;UINT&amp;gt;((d + h) / 2);&lt;br /&gt; src = pArr[pvt];&lt;br /&gt;&lt;br /&gt; do&lt;br /&gt; {&lt;br /&gt;  if (bAscending)&lt;br /&gt;  {&lt;br /&gt;   while (pArr[j] &amp;lt; src) j++;&lt;br /&gt;   while (pArr[i] &amp;gt; src) i--;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   while (pArr[j] &amp;gt; src) j++;&lt;br /&gt;   while (pArr[i] &amp;lt; src) i--;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (i &amp;gt;= j)&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;   if (i != j)&lt;br /&gt;   {&lt;br /&gt;    tmp = pArr[i];&lt;br /&gt;    pArr[i] = pArr[j];&lt;br /&gt;    pArr[j] = tmp;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   i--;&lt;br /&gt;   j++;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; while (j &amp;lt;= i);&lt;br /&gt;&lt;br /&gt; if (d &amp;lt; i) doQuickSortRecursive(pArr, d, i, bAscending);&lt;br /&gt; if (j &amp;lt; h) doQuickSortRecursive(pArr, j, h, bAscending);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;template &amp;lt;class TYPE, class ARG_TYPE&amp;gt; &lt;br /&gt;inline BOOL CSortArray&amp;lt;TYPE, ARG_TYPE&amp;gt;::doQuickSort(TYPE *pArr, int nSize, BOOL bAscending)&lt;br /&gt;{&lt;br /&gt; BOOL rc = TRUE;&lt;br /&gt; int  low, high;&lt;br /&gt;&lt;br /&gt; if (nSize &amp;gt; 1)&lt;br /&gt; {&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;   low  = 0;&lt;br /&gt;   high = nSize - 1;&lt;br /&gt;&lt;br /&gt;   doQuickSortRecursive(pArr, low, high, bAscending);&lt;br /&gt;  }&lt;br /&gt;  catch (...)&lt;br /&gt;  {&lt;br /&gt;   ::SetLastError(ERROR_INVALID_PARAMETER);&lt;br /&gt;   rc = FALSE;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  ::SetLastError(ERROR_INVALID_PARAMETER);&lt;br /&gt;  rc = FALSE;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return rc;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;template &amp;lt;class TYPE, class ARG_TYPE&amp;gt; &lt;br /&gt;inline void CSortArray&amp;lt;TYPE, ARG_TYPE&amp;gt;::QuickSort(BOOL bAscending/* = TRUE*/)&lt;br /&gt;{&lt;br /&gt; if (GetSize() &amp;gt; 1)&lt;br /&gt; {&lt;br /&gt;  doQuickSort(GetData(), GetSize(), bAscending);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;使い方は簡単。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++"&gt;&lt;br /&gt;// CSortArray 使い方&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;// 構造体の定義&lt;br /&gt;&lt;br /&gt;typedef struct _DATA&lt;br /&gt;{&lt;br /&gt; WORD   wID;&lt;br /&gt; double dbValue;&lt;br /&gt; &lt;br /&gt; // 比較演算子の定義&lt;br /&gt; BOOL operator &amp;gt; (const _DATA &amp;dt) const&lt;br /&gt; {&lt;br /&gt;  return (dbValue &amp;gt; dt.dbValue);&lt;br /&gt; }&lt;br /&gt; BOOL operator &amp;lt; (const _DATA &amp;dt) const&lt;br /&gt; {&lt;br /&gt;  return (dbValue&amp;lt; dt.dbValue);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;DATA, *LPDATA;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;// 使用&lt;br /&gt;void function()&lt;br /&gt;{&lt;br /&gt; CSortArray&amp;lt;DATA&amp;gt; ary;&lt;br /&gt; DATA dt;&lt;br /&gt;&lt;br /&gt; for (int i = 0; i &amp;lt; 10; i ++)&lt;br /&gt; {&lt;br /&gt;  dt.wID = i;&lt;br /&gt;  t.dbValue = rand() * 0.01;&lt;br /&gt;  ary.Add(dt);&lt;br /&gt;  cout &amp;lt;&amp;lt; "ID: " &amp;lt;&amp;lt; i &amp;lt;&amp;lt; "  -  Value: " &amp;lt;&amp;lt; dt.dbValue &amp;lt;&amp;lt; endl;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // ary.QuickSort(TRUE); // 昇順&lt;br /&gt; ary.QuickSort(FALSE); // 降順&lt;br /&gt;&lt;br /&gt; cout &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt; for (int i = 0; i &amp;lt; 10; i ++)&lt;br /&gt; {&lt;br /&gt;  cout &amp;lt;&amp;lt; "ID: " &amp;lt;&amp;lt; ary[i].wID &amp;lt;&amp;lt; "  -  Value: " &amp;lt;&amp;lt; ary[i].dbValue &amp;lt;&amp;lt; endl;&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5111958154917314907-7050384108966471397?l=shoichi-lifestyle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shoichi-lifestyle.blogspot.com/feeds/7050384108966471397/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2009/12/carray.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/7050384108966471397?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/7050384108966471397?v=2'/><link rel='alternate' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2009/12/carray.html' title='CArrayをソートする'/><author><name>y.shoichi</name><uri>http://www.blogger.com/profile/16378008406355405546</uri><email>noreply@blogger.com</email></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;A08EQXo7eCp7ImA9WxBSFE0.&quot;'><id>tag:blogger.com,1999:blog-5111958154917314907.post-6452725104328764553</id><published>2009-12-15T09:57:00.017+09:00</published><updated>2009-12-22T00:36:40.400+09:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-12-22T00:36:40.400+09:00</app:edited><title>CStringConvert クラス</title><content type='html'>CStringクラスを使用してる時などに便利なCStringConvertクラスを作成。&lt;br /&gt;CStringConvertクラスを継承することで利用可能。&lt;br /&gt;&lt;br /&gt;・DwToIPAddress&lt;br /&gt;32bitに格納されたソケットアドレスを「AAA.BBB.CCC.DDD」形式に変換&lt;br /&gt;&lt;br /&gt;・DwToString&lt;br /&gt;整数値をCStringに変換&lt;br /&gt;&lt;br /&gt;・DbToString&lt;br /&gt;浮動小数点数っをCStringに変換&lt;br /&gt;&lt;br /&gt;・DbToHMSTime&lt;br /&gt;計測した時間を浮動小数点数から時刻形式に変換&lt;br /&gt;&lt;br /&gt;・BigNumToString&lt;br /&gt;CStringに格納された大きな整数を見やすいように整形（1,000,000など)&lt;br /&gt;&lt;br /&gt;・CStoCBA&lt;br /&gt;CStringからCByteArrayに変換（ユニコード対応）&lt;br /&gt;&lt;br /&gt;・CBAtoCS&lt;br /&gt;CByteArrayからCStringに変換（ユニコード対応）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++"&gt;&lt;br /&gt;#pragma once&lt;br /&gt;&lt;br /&gt;#include &amp;lt;afxwin.h&amp;gt;&lt;br /&gt;&lt;br /&gt;class CStringConvert&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; CStringConvert() {}&lt;br /&gt; virtual ~CStringConvert() {}&lt;br /&gt;&lt;br /&gt; CString DwToIPAddress(DWORD dwAddress)&lt;br /&gt; {&lt;br /&gt;  CString cs;&lt;br /&gt;  dwAddress = htonl(dwAddress);&lt;br /&gt;  cs.Format(_T("%d.%d.%d.%d"),&lt;br /&gt;   (dwAddress &amp;gt;&amp;gt; 24) &amp; 0xff,&lt;br /&gt;   (dwAddress &amp;gt;&amp;gt; 16) &amp; 0xff,&lt;br /&gt;   (dwAddress &amp;gt;&amp;gt; 8)  &amp; 0xff,&lt;br /&gt;   dwAddress &amp; 0xff);&lt;br /&gt;  return cs;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; CString DwToString(DWORD dwNum)&lt;br /&gt; {&lt;br /&gt;  CString cs;&lt;br /&gt;  cs.Format(_T("%d"), dwNum);&lt;br /&gt;  return cs;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; CString DbToString(double dbNum)&lt;br /&gt; {&lt;br /&gt;  CString cs;&lt;br /&gt;  cs.Format(_T("%10.4lf"), dbNum);&lt;br /&gt;  return cs;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; CString DbToHMSTime(double dbTime)&lt;br /&gt; {&lt;br /&gt;  CString cs;&lt;br /&gt;  UINT    uHour, uMinute, uSecond;&lt;br /&gt;&lt;br /&gt;  uHour   = static_cast&amp;lt;UINT&amp;gt;(dbTime / 3600);&lt;br /&gt;  uMinute = static_cast&amp;lt;UINT&amp;gt;((dbTime - uHour * 3600) / 60);&lt;br /&gt;  uSecond = static_cast&amp;lt;UINT&amp;gt;(dbTime - (uHour * 3600 + uMinute * 60));&lt;br /&gt;  cs.Format(_T("%02d:%02d:%02d"), uHour, uMinute, uSecond);&lt;br /&gt;&lt;br /&gt;  return cs;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; CString GetNowTime()&lt;br /&gt; {&lt;br /&gt;  CString  cs;&lt;br /&gt;  SYSTEMTIME  st;&lt;br /&gt;&lt;br /&gt;  GetLocalTime(&amp;st);&lt;br /&gt;  cs.Format(_T("%04d/%02d/%02d %02d:%02d:%02d"),&lt;br /&gt;   st.wYear, st.wMonth, st.wDay,&lt;br /&gt;   st.wHour, st.wMinute, st.wSecond);&lt;br /&gt;&lt;br /&gt;  return cs;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; void BigNumToString(CString &amp;csParam)&lt;br /&gt; {&lt;br /&gt;  NUMBERFMT nf;&lt;br /&gt;  TCHAR szBuf[100];&lt;br /&gt;&lt;br /&gt;  lstrcpy(szBuf, csParam.GetBuffer(100));&lt;br /&gt;  csParam.ReleaseBuffer();&lt;br /&gt;  nf.NumDigits     = 0;&lt;br /&gt;  nf.LeadingZero   = FALSE;&lt;br /&gt;  nf.Grouping      = 3;&lt;br /&gt;  nf.lpDecimalSep  = _T(".");&lt;br /&gt;  nf.lpThousandSep = _T(",");&lt;br /&gt;  nf.NegativeOrder = 0;&lt;br /&gt;  GetNumberFormat(LOCALE_USER_DEFAULT, &lt;br /&gt;   0, &lt;br /&gt;   szBuf, &lt;br /&gt;   &amp;nf, &lt;br /&gt;   csParam.GetBuffer(), &lt;br /&gt;   100);&lt;br /&gt;   csParam.ReleaseBuffer();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; void CStoCBA(CString &amp;cs, CByteArray &amp;data)&lt;br /&gt; {&lt;br /&gt;  LPBYTE lpData;&lt;br /&gt;  int    nLength;&lt;br /&gt;&lt;br /&gt;  nLength = cs.GetLength();&lt;br /&gt;  lpData = reinterpret_cast&amp;lt;LPBYTE&amp;gt;(static_cast&amp;lt;LPTSTR&amp;gt;(cs.GetBuffer()));&lt;br /&gt;  data.SetSize(cs.GetLength() * sizeof(TCHAR));&lt;br /&gt;  CopyMemory(data.GetData(), lpData, data.GetSize());&lt;br /&gt;  cs.ReleaseBuffer();&lt;br /&gt;  data.FreeExtra();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; void CBAtoCS(CByteArray &amp;data, CString &amp;cs)&lt;br /&gt; {&lt;br /&gt;  cs.SetString(reinterpret_cast&amp;lt;LPTSTR&amp;gt;(data.GetData()), data.GetSize() / sizeof(TCHAR));&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5111958154917314907-6452725104328764553?l=shoichi-lifestyle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shoichi-lifestyle.blogspot.com/feeds/6452725104328764553/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2009/12/cstringconvert.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/6452725104328764553?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/6452725104328764553?v=2'/><link rel='alternate' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2009/12/cstringconvert.html' title='CStringConvert クラス'/><author><name>y.shoichi</name><uri>http://www.blogger.com/profile/16378008406355405546</uri><email>noreply@blogger.com</email></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;CkINQng6eCp7ImA9WxBTEUs.&quot;'><id>tag:blogger.com,1999:blog-5111958154917314907.post-5703803542514456404</id><published>2009-12-07T13:34:00.001+09:00</published><updated>2009-12-07T13:36:33.610+09:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-12-07T13:36:33.610+09:00</app:edited><title>Lifestyle</title><content type='html'>&lt;span style="font-family: arial;"&gt;普段思いついたことや、趣味のプログラミングについて書いていこう。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5111958154917314907-5703803542514456404?l=shoichi-lifestyle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shoichi-lifestyle.blogspot.com/feeds/5703803542514456404/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2009/12/lifestyle.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/5703803542514456404?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5111958154917314907/posts/default/5703803542514456404?v=2'/><link rel='alternate' type='text/html' href='http://shoichi-lifestyle.blogspot.com/2009/12/lifestyle.html' title='Lifestyle'/><author><name>y.shoichi</name><uri>http://www.blogger.com/profile/16378008406355405546</uri><email>noreply@blogger.com</email></author><thr:total>0</thr:total></entry></feed>