gmo

画面遷移

1. ショッピングカート
/cart
[購入手続きへ]ボタン
→2へ

2. ご注文内容の確認
/shopping

・代引
[注文する]ボタン
→3へ

・クレカ
[クレジットカード決済へ]ボタン
→4へ

3. 注文完了
/shopping/complete

4. クレジットカード決済
/shopping/gmo_payment
[選択したカードでご注文を確定する]
→3へ
[入力したカード情報でご注文を確定する]
→3へ

上記、4のボタンを押下し、決済実行のレスポンスがOKなら以下の受注情報を更新。
受注情報

受注日

受注ステータス(新規受付)

  • -

ShoppingController.php

confirm
processPurchase
setOrderUpdateData

  • -

PaymentController.php

mode=next

index

→creditProcess(registCreditProcess(登録クレジットカード)も同じ)
if ('POST' === $this->app['request']->getMethod()) {
if ("next" == $mode) {
return $this->creditCommit($Order, $data);

→creditCommit
$objPageHelper->modeAction($mode, $formData, $Order, $PaymentExtension, $this->app);
if ($objPageHelper->isComplete) {
$orderId = $objPageHelper->orderId;
$order = $this->app['eccube.repository.order']->findOneBy(array('id' => $orderId));

$this->changeOrderData($Order);

→changeOrderData
$Order->setOrderDate(new \DateTime());
$orderService = $this->app['eccube.service.order'];
$orderService->setStockUpdate($em, $Order);
if ($this->isGranted($this->app)) {
// 会員の場合、購入金額を更新
$orderService->setCustomerUpdate($em, $Order, $this->app->user());
}

$em->flush();
$em->getConnection()->commit();


PageHelper_Credit.php

→modeAction
switch ($mode) {
case 'next':
// 決済実行(ここでGMOと通信。レスポンスが取れないときは?)
PG_MULPAY_Client_Credit->doPaymentRequest

// 新規受付
$order_status = $app['config']['order_new'];
$order->setOrderStatus($app['eccube.repository.order_status']->find($order_status));
$app['orm.em']->persist($order);
$app['orm.em']->flush();

// ここで通信エラーの場合(登録クレジットカードのみ)
$cardSeq = $this->registCard($OrderExtension, $listParam, false);

$this->isComplete = true;

Macアドレス

Imports System.Management
Imports System.Net.NetworkInformation
Imports System.Text.RegularExpressions

Module Module1

Sub Main()

' onlineで認証するなら
Dim query As String = "SELECT * FROM Win32_NetworkAdapterConfiguration"
Dim searcher As New ManagementObjectSearcher(query)

Dim queryCollection As ManagementObjectCollection = searcher.Get()
Dim mo As ManagementObject
For Each mo In queryCollection
If Convert.ToBoolean(mo("IPEnabled")) Then
Console.WriteLine(mo("MacAddress").Replace(":", ""))
End If

Next

' offlineで認証するなら
Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
For Each nic In nics
If nic.NetworkInterfaceType <> NetworkInterfaceType.Ethernet Then
Continue For
End If

Dim macAddr As String = nic.GetPhysicalAddress().ToString()
Console.WriteLine(macAddr)
Next


' 認証
Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
For Each nic In nics
If nic.NetworkInterfaceType <> NetworkInterfaceType.Ethernet Then
Continue For
End If

Dim macAddr As String = nic.GetPhysicalAddress().ToString()
If Regex.IsMatch(macAddr, "^[0-9A-F]{12}$") Then
Console.WriteLine(macAddr)
End If
Next

End Sub

End Module

memo3

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
* Base64エンコードクラス
* 見間違いやすい文字を排除するため、Base64(RFC2045)の英数記号と一部異なる
*/
public class Base64Encorder {

/**
* 対象文字列をSHA-1でハッシュ化し、Base64(RFC2045)にエンコードする
* Base64の英数字で見間違いやすい文字を記号に置き換える
*
* @param src 対象文字列
* @return エンコード結果
* @throws NoSuchAlgorithmException
*/
public static String encode(String src) throws NoSuchAlgorithmException {
if (src == null || src.isEmpty()) {
return null;
}
// SHA-1ハッシュ化
byte[] bytes = MessageDigest.getInstance("SHA-1").digest(src.getBytes(StandardCharsets.UTF_8));
// Base64エンコード
String dst = Base64.getEncoder().encodeToString(bytes);
// 見間違いやすい文字を記号に置き換える
return replaceSimilarChar(dst);
}

/**
* Base64(RFC2045)の見間違いやすい英数字を記号に置き換える
*
* @param src 対象文字列
* @return 置換結果
*/
private static String replaceSimilarChar(String src) {

final Map replacements = new HashMap<>();
replacements.put('0', '&');
replacements.put('O', '#');
replacements.put('1', '@');
replacements.put('I', '%');
replacements.put('l', '?');

String dst = src;
for (Map.Entry map : replacements.entrySet()) {
dst = dst.replace(map.getKey(), map.getValue());
}
return dst;
}

}

memo

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author dokyou3
 */
public class RedirectServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String[] paths = request.getRequestURL().toString().split("/");
        String plantCd = paths[paths.length-2];
        response.sendRedirect(request.getContextPath() + "/login?plantCd=" + plantCd);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>RedirectServlet</servlet-name>
        <servlet-class>RedirectServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>RedirectServlet</servlet-name>
        <url-pattern>/N/login</url-pattern>
        <url-pattern>/Q/login</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

memo

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*
* @author dokyou3
*/
public class RedirectServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String[] paths = request.getRequestURL().toString().split("/");
String plantCd = paths[paths.length-2];
response.sendRedirect(request.getContextPath() + "/login?plantCd=" + plantCd);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}

@Override
public String getServletInfo() {
return "Short description";
}

}





LoginServlet
LoginServlet


RedirectServlet
RedirectServlet


LoginServlet
/login


RedirectServlet
/N/login
/Q/login



30


神奈川J1チームの聖地

今回はこの記事をサッカーでやってみました。

horicun.hatenablog.com

神奈川県のJ1チーム(2016)で同じことをやってみます。

http://horicun.hatenablog.com/entry/2017/06/18/200726:f:id:dokyou3:20170624225437p:plain

聖地はどこだ!

まずは外心を求めてみます。

import math

# yokohama
x1 = 35.510195
y1 = 139.606362
# kawasaki
x2 = 35.593980
y2 = 139.653738
# shounan
x3 = 35.343804
y3 = 139.341233

x_n = (x1 ** 2 + y1 ** 2) * (y2 - y3) + (x2 ** 2 + y2 ** 2) * (y3 - y1) + (x3 ** 2 + y3 ** 2) * (y1 - y2)
y_n = (x1 ** 2 + y1 ** 2) * (x3 - x2) + (x2 ** 2 + y2 ** 2) * (x1 - x3) + (x3 ** 2 + y3 ** 2) * (x2 - x1)
d = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)
x = x_n / (2 * d)
y = y_n / (2 * d)

print(str(x) + "," + str(y))

実行結果がこれ

35.75784648334858,139.26616287535109

googleで調べてみると (・・?)
f:id:dokyou3:20170624233002p:plain

山??

どこだ??

f:id:dokyou3:20170624234201p:plain

神奈川J1チームの聖地が東京に…

しかも結構遠い。。。

というわけで電車の所要時間で聖地を探してみます。

public class App {
	public static void main(String[] args) throws IOException {
		final String chromeDriverPath = "chromedriver";
		System.setProperty("webdriver.chrome.driver", chromeDriverPath);
		WebDriver driver = new ChromeDriver();

		String to[] = { "日産スタジアム", "等々力競技場", "スタジアム平塚" };

		File file = new File("out.csv");
		PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));

		Scanner scanner = new Scanner(new File("station20170403free.csv"));
		scanner.nextLine();
		while (scanner.hasNextLine()) {
			String line = scanner.nextLine();
			String from = line.split(",")[2];
			double la = Double.parseDouble(line.split(",")[9]);
			double lo = Double.parseDouble(line.split(",")[10]);
			if (139.341233 < la && la < 139.653738 && 35.343804 < lo && lo < 35.593980) {
				String writeline = from + ",";
				for (int i = 0; i < to.length; i++) {
					driver.get("https://transit.yahoo.co.jp/search/result?flatlon=&from=" + from + "&tlatlon=&to="
							+ to[i]
							+ "&via=&via=&via=&y=2017&m=06&d=08&hh=17&m2=0&m1=3&type=1&ticket=ic&al=1&shin=1&ex=1&hb=1&lb=1&sr=1&s=0&expkind=1&ws=3");
					WebElement we = driver.findElements(By.className("time")).get(1);
					String text = we.getText();
					String minitus = text.split("(")[1].replaceAll("分)", "");
					writeline += minitus + ",";
				}
				pw.println(writeline);
			}
		}
		pw.close();
	}
}

seleniumはここのサイトを参考にさせてもらいました。
unagi-tabetai.hatenablog.com

で、結果がこんな感じです!

f:id:dokyou3:20170625143241p:plain

ブルーラインの駅が多いです
下飯田駅中田駅の分散が同じなので、平均時間の低い「中田駅」聖地とします!

どんな駅か調べてみました。
https://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Nakada-Sta-2.JPG/1920px-Nakada-Sta-2.JPGf:id:dokyou3:20170625143621j:plain

地下鉄開業前は交通の便が悪いにも関わらず1960年代から宅地開発が進行していた。戸塚駅までの長後街道の慢性的な交通渋滞と不安定なバスの運行に悩まされていた中田地区の住民にとって、地下鉄開業は数十年来の悲願であった。
横浜市郊外部の特徴である農村と新興住宅地の共存が見られる地域である。
(中田駅 - Wikipedia より引用)

ちなみに平均時間だけでみると「横浜駅」がtopでした。
どこ行くのにもやっぱり横浜が便利!


聖地中田駅に今度行ってみようかな。。