パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください -36ページ目

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

今回はFacebookアプリをHerokuに作成する手順を記載します。


●FacebookアプリをHerokuに作成

1. Facebookにログイン

2. 開発者ページ(facebook developers)に遷移
- Facebookログイン後のトップページの左のメニュー一覧に「開発者」から
     遷移できます。

3. 開発者ページの右上の「新しいアプリを作成」ボタンを選択

4. 「新しいアプリを作成」画面が立ち上がり設定値を入力します。
- App Name → アプリケーション名を入力します。
- App Namespace → NameSpace名を入力します。(任意)
- Web Hosting → チェックボックスにチェックを入れます。
※Herokuを使いますか?という項目です。

5. セキュリティチェック画面に遷移するので、表示された文字列を入力してください。

6. 作成アプリケーションの使用言語を選択し、メールアドレスを入力してください。
入力後に作成ボタンを押してください。
- 今回はPHPなのでPHPを選択します。
- 入力したメールアドレスにHerokuにユーザー登録するためのURLが通知されます。
(Facebookアカウントとか無関係です。)
すでにHerokuユーザーになっている場合は登録済みのメールアドレスを入力すればOKです。
Facebookとは別にHerokuへの登録が必要になります。

7. Success画面に遷移すればアプリケーション作成完了です。
- Success画面の「Go to App」ボタンを押下すると、生成されたクラウドのホスティングURLに移動できます。

8. Facebookアプリケーション作成時に設定したメールアドレスに、Heroku登録用のURIが通知されます。
登録用のURIからHerokuへの登録を行ってください。※未登録の場合
- メールアドレス
- パスワード

9. HerokuのアプリケーションとFacebookで作成したアプリケーションの確認
- Facebookで作成したアプリケーションの「Hosting URL」に使用されているアドレスと
Herokuのアプリケーション名が同一であることを確認する
(Herokuにログインして、上位メニューにある「Apps」を選択し、
アプリケーション一覧を表示できます。)
- 例)https://sample-php-1111.herokuapp.com/ (Facebook:Hosting URL)
sample-php-1111(Heroku:アプリケーション名)
※アプリケーションの設定確認・編集などは
Herokuのアプリケーションの設定画面から行います。

ここまでがアプリケーションの作成となります。

次回は作成したアプリケーションに対して、Gitを使用してのPHPをアップロードする方法を説明します。
MS VCでXmlデータを扱うには、標準クラスがないので
XML DOM Document(COM)を使用することになる。

XML DOM Documentを読み込むため下記のimportが必要になる。

#import "msxml6.dll" named_guids raw_interface_only

それと、COMなのでXML DOM Documentを使用する前後に下記の処理をしなければならない。
CoInitialize
CoUninitialize

言葉で説明するよりコードを見た方が理解しやすいと思うので
実際にXmlを読み込む処理を下記に記載する。

読み込むだけなら簡単である。

○ヘッダー(XmlSample.h)
#pragma once
#include
#include
using namespace std;

class XmlSample
{
public:
XmlSample(void);
~XmlSample(void);

//指定したファイルパスのXMLを読み込む
wstring FileReader(wstring path);
};


○実装(XmlSample.cpp)

#include "StdAfx.h"
#include "XmlSample.h"
#include

#import "msxml6.dll" named_guids raw_interface_only

XmlSample::XmlSample(void)
{
//COMの初期化
::CoInitialize(0);
}


XmlSample::~XmlSample(void)
{
//COMの解放
::CoUninitialize();
}

wstring XmlSample::FileReader(wstring path)
{
//xmlオブジェクト生成
MSXML2::IXMLDOMDocument2Ptr reader;
reader.CreateInstance(__uuidof(MSXML2::DOMDocument60),NULL,CLSCTX_INPROC_SERVER);

//ロード
VARIANT_BOOL isSuccessful;
reader->load(CComVariant(path.c_str()), &isSuccessful);

//xmlの読み込み
BSTR buf = 0;
wstring ret;
reader->get_xml(&buf);
ret.append(buf);
::SysFreeString(buf);

//xmlオブジェクト解放
reader.Release();

return ret;
}

上記のような読み込む処理だけでは、実践的ではないので
次に、実践でも使えそうな処理として
ネームスペースを使用しているXMLからXPathのNodeデータを取得するコードを記載する。

○ヘッダー(XmlSample.h)
#pragma once
#include
#include
using namespace std;

class XmlSample
{
public:
XmlSample(void);
~XmlSample(void);

// XMLデータから固定XPathのデータを取得
wstring GetNode(wstring xmldata);
};


○実装(XmlSample.cpp)

#include "StdAfx.h"
#include "XmlSample.h"
#include

#import "msxml6.dll" named_guids raw_interface_only

#define NAME_SPACE _T("xmlns:ns='hoge'")
#define XPATH _T("/ns;sample/ns:data")
XmlSample::XmlSample(void)
{
//COMの初期化
::CoInitialize(0);
}


XmlSample::~XmlSample(void)
{
//COMの解放
::CoUninitialize();
}

wstring XmlSample::GetNode(wstring xmldata)
{
//xmlオブジェクト生成
MSXML2::IXMLDOMDocument2Ptr reader;
reader.CreateInstance(__uuidof(MSXML2::DOMDocument60),NULL,CLSCTX_INPROC_SERVER);

//xpathをサポートするように設定
reader->setProperty(CComBSTR(L"SelectionLanguage"),CComVariant(L"XPath"));
//namespaceをサポートするように設定
reader->setProperty(CComBSTR(L"SelectionNamespaces"),CComVariant(NAME_SPACE));

//ロード
VARIANT_BOOL isSuccessful;
reader->loadXML(xmldata.c_str(),&isSuccessful);

//下記のxpathのデータを取得
// /sample/data
wstring ret;
MSXML2::IXMLDOMNodePtr node=0;
reader->selectSingleNode(XPATH,&node);

if(NULL != node)
{
//xpath(/sample/data)のデータを取得
BSTR value = 0;
node->get_text(&value);
ret.append(value);
::SysFreeString(value);
}

//xmlオブジェクト解放
reader.Release();

return ret;
}

ちなみに複数のネームスペースをサポートする際は、
#define NAME_SPACEの定義をスペースで区切ればよい。

以上。
@some

長らく鎖国を続けてきた名詞の王国
ついに動詞を受け入れるみたいですね~

こんにちわ、ちかです

さて 今回は
reduce という関数を紹介しつつ
好き勝手に言いたいことを言うつもりですw

今回の記事は王国の事情とは何の関係もなく書いたものですが
reduce も王国に入るらしいので結果オーライ!

はじめに

というわけで
畳み込み関数 reduce を紹介しようと思います。

reduce は多くのプログラミング言語の標準ライブラリにひっそりと組み込まれている関数です。
ライブラリによって関数名は reduce じゃなかったりします。

Python reduce()
JavaScript reduce()
C++/STL std::accumulate()
.NET Framework/LINQ Enumerable.Aggregate()

などなど。

導入

reduce は 3 つの引数を取ります。

2 引数関数 callback(previousResult, currentValue)
リスト values = [values[0], values[1], ... , values[n]]
初期値 initialValue


たとえば
↓こんな計算↓ をします。

callback 関数定義 結果 (を計算する式)
reduce(add, [2,3,4,5,6], 0) add(previousResult, currentValue)
  = previousResult + currentValue
(((((0+2)+3)+4)+5)+6)
reduce(multiply, [2,3,4,5,6], 1) multiply(previousResult, currentValue)
  = previousResult * currentValue
(((((1*2)*3)*4)*5)*6)
reduce(either, [flag1,flag2,flag3], false) either(previousResult, currentValue)
  = previousResult or currentValue
(((false or flag1) or flag2) or flag3)
reduce(both, [flag1,flag2,flag3], true) both(previousResult, currentValue)
  = previousResult and currentValue
(((true and flag1) and flag2) and flag3)

reduce がやっていることはこんな感じです:
  ・ リストを走査して callback を呼びまくる。
    - currentValue には現在の要素を渡す。
    - previousResult には前回の callback の戻り値を渡す。ただし初回は initialValue を渡す。
  ・ 最後の callback の戻り値を返す。

表現を変えれば:

・ 再帰的定義

reduce(callback, [], initialValue) = initialValue
reduce(callback, [values[0], ... ], initialValue) = reduce(callback, [ ... ], callback(initialValue, values[0]))

・ 展開した式

reduce(callback, [values[0], values[1], ... , values[n-1], values[n]], initialValue)
  = callback(
      callback(
        ...
          callback(
            callback(initialValue, values[0]),
          values[1]),
        ... ,
      values[n-1]),
    values[n])

・ ループによる実装

def reduce(callback, values, initialValue):
    result = initialValue
    for value in values:
        result = callback(result, value)
    return result

つかってみる

reduce はブラウザ上でも試すことができます。※IE9以上

JavaScript の reduce は配列 Array のメソッドになっていて
values.reduce(callback, initialValue) という形で呼び出します。

ということで
アドレスバーに次のように入力します。
※ブラウザによってはコピペすると最初の "javascript:" が消えるので書き足す必要があります。

javascript:alert([2,3,4,5,6].reduce(function(previousResult, currentValue){ return previousResult * currentValue; }, 1));

(1 * 2 * 3 * 4 * 5 * 6) の計算結果 720 が表示されたでしょうか??

reduce は文字列の連結にも使えます。
次は文字列配列の要素をダブルクォートで括って & 区切りで連結する例です。

javascript:alert(['abc','de','fghi'].reduce(function(previousResult, currentValue){ return previousResult + '&"' + currentValue + '"'; }, '').slice(1));

引数 initialValue を省略した場合は『 ... callback(callback(values[0], values[1]), values[2]), ... 』が返ります。
次は最大値を求める例です。

javascript:alert([4,7,3,1,6].reduce(function(previousResult, currentValue){ return previousResult < currentValue ? currentValue : previousResult; }));

つかえそう??

だんだん見えてきたでしょうか??
おもしろそうに見えてきたでしょうか??

どこが便利なの?? なにが嬉しいの?? と思うひとへ。
  あなたの感覚は全く正しいです。
  この記事はあなたには必要なさそうです。

おもしろそうに見えてきたひとへ。
  じゃあ次は
  reduce で (12 + 22 + ... + 102) を求めてみましょっか。

javascript:alert([1,2,3,4,5,6,7,8,9,10].reduce(function(previousResult, currentValue){ ここを変えましょう }, 0));

できました??

昔よく見かけた「選択すると答えが浮かび上がるよ」を用意しましたよ。

javascript:alert([1,2,3,4,5,6,7,8,9,10].reduce(function(previousResult, currentValue){ return previousResult + (currentValue * currentValue); }, 0));

いい頭の体操になったのではないでしょうか??

結論

reduce を紹介してきましたが
reduce の紹介はこの記事の目的ではありません。

この記事の目的は 私が好き勝手に言いたいことを言う ことです。

ふぅ。
さて。
言います。

reduce は使わずループで書くべし!

聞こえました??

勝手に紹介しておいて使うなとはナニゴトじゃ!

というあなたのお怒りのも当然ですが
私は
reduce を読めるようにはなってほしいけど
reduce を書いてほしいわけじゃありません。

ソースコードを眺めていく中で

return values.reduce(function(previousResult, currentValue){
    return previousResult + (currentValue * currentValue);
}, 0);

とか

return std::accumulate(values.begin(), values.end(), 0.0,
    [](const double& previousResult, const double& currentValue){
        return previousResult + (currentValue * currentValue);
    }
);

とかが出てきたら
パッと見では何をしているのか分からないひとが多いと思います。

reduce は頭の体操であり、ボケ防止であり、
採用時の「ふるい」には使えるかもしれないけど、
みんなが読むコードに入れるのは微妙です。

分散コンピューティングの世界では必要不可欠なのかもしれませんが
業務アプリのちょっとしたループ処理を reduce で記述するのは可読性を落とすだけかと思います。

ループで書いちゃえばいいんです。
なんにも難しいことはないでしょう。

var sumOfSquares = 0;
for (var i = 0; i < values.length; i++) {
    sumOfSquares += values[i] * values[i];
}
return sumOfSquares;

どうしても使いたいなら
最低でもコメントは書きましょうね。。

// values の平方和 (values[0]^2 + values[1]^2 + ・・・ + values[n]^2) を返す
return values.reduce(function(previousResult, currentValue){
    return previousResult + (currentValue * currentValue);
}, 0);

むかしばなし

実は昔
私自身
「ループを reduce で書きたくなる」症候群に陥ったことがあります。

なぜ関数プログラミングは重要かという論文を読むと
再帰万歳! reduce 万歳! 関数型言語万歳! みたいな気持ちになるんです。

たぶん、どうやら、なんとなく、
ちょっと頭がよくなったような気がするんですよね、
関数プログラミングとか reduce とかって。

でもそれはカンチガイです。
頭がよくなったのではなく
調子に乗っただけのことです。

さいごに

ポール・グレアムが(LISP は) 技術じゃなくて数学だったって言ってるのと同じ意味で
reduce は数学なのだろうと思います。
技術は必要に応じて数学を取り入れますが、数学に縛られたりはしません。

クリスマスプレゼントに金槌をもらった子どもは、何でも叩きたがる。

(金槌の法則 ―― ジェラルド・M・ワインバーグ)

これはおもに私への戒めですが
武器を新しく手に入れても
やたらめったら使わずに
ちゃんと用途を考えましょう。

でわでわ

p.s. (←しつこい)

reduce について理解できたひと!
こんな会社が採用活動してますよ!
https://www.facebook.com/park.corp.recruit

会員No.18です。

JavaでWebサービス(SSL)のメソッドを呼び出す方法を2つ紹介します。

■トラストストアにサーバー証明書をインポートする方法

まず、サーバー証明書取得します。 ※Firefox(16.02)の場合
・Firefoxを起動
・アクセスするWebサービスのWSDL等のURLにアクセス
・アドレスバーの左の錠前アイコンをクリック
・[詳細を表示]ボタンをクリック
・[セキュリティ]タブをクリック
・[証明書を表示]ボタンをクリック
・[詳細]タブをクリック
・[エクスポート]ボタンをクリックし任意のパスにサーバー証明書(XXX.crt ※XXXは任意)を保存

次に下記コマンドでトラストストアにサーバー証明書をインポートします。
・コマンドプロンプトを起動しサーバー証明書(XXX.crt)があるフォルダで下記コマンドを実行
"%JAVA_HOME%\bin\keytool" -import -alias XXX -file XXX.crt -keystore jssecacerts

キーストアのパスワードを入力してください: ← changeit //JDKお決まり
新規パスワードを再入力してください: ← changeit //JDKお決まり
この証明書を信頼しますか? [no]: ← yes
証明書がキーストアに追加されました。

・jssecacertsというファイルができるのでJDKの下記フォルダにコピー
%JAVA_HOME%\jre\lib\security

下記のようなコードでWebサービスメソッド(例:xxx())にアクセス可能です。

public static void main(String[] args) {
TestService testService = new TestService();
TestPort testPort = testService.getTestPort();

// Test Service URL
String serviceUrl = "https://xxx.yyyy.com:8443/test/";
((BindingProvider) testPort).getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceUrl);

// Webサービス呼び出し
testPort.xxx();

:
}



■自己証明(所謂オレオレ証明)等で、証明書検証エラーを無視する方法

下記のようなクラスを作った場合、Webサービスのメソッド(例:xxx())はTestBase.getTestPort().xxx()のように呼び出せます。


public class TestBase {

private static TestPort testPort;

public static TestPort getTestPort() {
return testPort;
}

static {
// Test Service class
TestService testService = new TestService();
testPort = testService.getTestPort();

// Test Service URL
String validatorUrl = "https://xxx.yyyy.com:8443/test/";
((BindingProvider) testPort).getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, validatorUrl);

X509TrustManager xtm = new MyTrustManager();
TrustManager[] mytm = {xtm};
SSLContext ctx = null;

try {
ctx = SSLContext.getInstance("SSL");
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(TestBase.class.getName()).log(Level.SEVERE, null, ex);
}

try {
ctx.init(null, mytm, null);
} catch (KeyManagementException ex) {
Logger.getLogger(TestBase.class.getName()).log(Level.SEVERE, null, ex);
}

SSLSocketFactory sslFact = (SSLSocketFactory) ctx.getSocketFactory();

HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
};

HttpsURLConnection.setDefaultSSLSocketFactory(sslFact);
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}

public static class MyTrustManager implements X509TrustManager {

MyTrustManager() {
}

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

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

@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
}
会員No.18です。

巨大なwsdlを読み込んでみたら。。
あらら、エラーになってしまった。

>wsimport -keep -b TestSoap.xsd -Xnocompile -s src -d bin -verbose TestApi.wsdl
parsing WSDL...

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.ArrayList.(ArrayList.java:112)
at java.util.ArrayList.(ArrayList.java:119)
at com.sun.codemodel.internal.JBlock.(JBlock.java:42)
at com.sun.codemodel.internal.JBlock.(JBlock.java:56)
at com.sun.codemodel.internal.JMethod.body(JMethod.java:351)
at com.sun.tools.internal.xjc.generator.bean.ObjectFactoryGeneratorImpl.
populate(ObjectFactoryGeneratorImpl.java:272)


-Jオプションでメモリ設定したら成功しました。

>wsimport -J-Xmx1024M -keep -b TestSoap.xsd -Xnocompile -s src -d bin -verbose TestApi.wsdl