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.put('0', '&');
replacements.put('O', '#');
replacements.put('1', '@');
replacements.put('I', '%');
replacements.put('l', '?');
String dst = src;
for (Map.Entry
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";
}
}
30
神奈川J1チームの聖地
今回はこの記事をサッカーでやってみました。
神奈川県のJ1チーム(2016)で同じことをやってみます。
http://horicun.hatenablog.com/entry/2017/06/18/200726:
聖地はどこだ!
まずは外心を求めてみます。
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で調べてみると (・・?)
山??
どこだ??
神奈川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
で、結果がこんな感じです!
ブルーラインの駅が多いです
下飯田駅と中田駅の分散が同じなので、平均時間の低い「中田駅」聖地とします!
どんな駅か調べてみました。
https://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Nakada-Sta-2.JPG/1920px-Nakada-Sta-2.JPG
地下鉄開業前は交通の便が悪いにも関わらず1960年代から宅地開発が進行していた。戸塚駅までの長後街道の慢性的な交通渋滞と不安定なバスの運行に悩まされていた中田地区の住民にとって、地下鉄開業は数十年来の悲願であった。
横浜市郊外部の特徴である農村と新興住宅地の共存が見られる地域である。
(中田駅 - Wikipedia より引用)
ちなみに平均時間だけでみると「横浜駅」がtopでした。
どこ行くのにもやっぱり横浜が便利!
聖地中田駅に今度行ってみようかな。。