決済系APIを実装したい

### PayPal
月間のペイパルによる売上高
30万円以下:3.6 % + 40 円 / 件
30万円超 100万円以下:3.4 % + 40 円 / 件
100万円超 1,000万円以下:3.2 % + 40 円 / 件
1,000万円超:2.9 % + 40 円 / 件

paypalの実装方法:
https://qiita.com/PPJP/items/db5c57991c2c3fe80ac7

### Stripe
手数料:3.6%
-> smartHR, Booking.com, slack, shopify, freee, cookpad
-> Ruby, Java, Scala and Javascript

### PAY.JP
ベーシックプラン
月額費用:0¥
visa / master:3.0%
jcb / american express / dinersclub /discover:3.6%

プロプラン
月額費用:10,000¥
visa / master:2.59%
cb / american express / dinersclub /discover:3.3%

-> クレジットカード決済を導入できる
-> bizreach, baseなど

### Square
https://squareup.com/jp/ja
3.6%(Visa/MasterCard/American Expressのみ)
-> 決済種類豊富
-> HPを見る限り、店舗中心か

とりあえず、上から順番に試していきますかー

[jdk14.0.2] 基礎2

package hpscript.myapp;
import hpscript.myapp.model.User;
import hpscript.myapp.model.AdminUser;

public class MyApp {

	public static void main(String[] args){

		User tom;
		tom = new User("john");

		System.out.println(tom.name);
		tom.sayHi();

		AdminUser bob = new AdminUser("bob");
		System.out.println(bob.name);
		bob.sayHello();
	}
}

$ javac hpscript/myapp/MyApp.java
$ java hpscript.myapp.MyApp

getter, setter

class User {
	private String name;
	private int score;

	public User(String name, int score){
		this.name = name;
		this.score = score;
	}

	public int getScore(){
		return this.score;
	}

	public void setScore(int score){
		if (score > 0){
			this.score = score;
		}
	}
}



public class MyApp {

	public static void main(String[] args){

		User tom = new User("tom", 65);
		tom.setScore(85);
		tom.setScore(-22);
		System.out.println(tom.getScore());
	}
}

static

class User {
	private String name;
	private static int count = 0;

	public User(String name){
		this.name = name;
		User.count++;
	}

	public static void getInfo(){
		System.out.println("# of instances: " + User.count);
	}
}

public class MyApp {
	public static void main(String[] args){
		User.getInfo();
		User tom = new User("tom");
		User.getInfo();
		User bob = new User("bob");
		User.getInfo();
	}
}

initializer

class User {
	private String name;
	private static int count;

	static {
		User.count = 0;
		System.out.println("Static initializer");
	}

	{
		System.out.println("instance initializer");
	}

	public User(String name){
		this.name = name;
		User.count++;
		System.out.println("Constructor");
	}

	public static void getInfo(){
		System.out.println("# of instances: " + User.count);
	}
}

public class MyApp {
	public static void main(String[] args){
		User.getInfo();
		User tom = new User("tom");
		User.getInfo();
		User bob = new User("bob");
		User.getInfo();
	}
}

final

class User {
	protected String name;
	private static final double VERSION = 1.1;

	User(String name){
		this.name = name;
		User.VERSION = 1.2;
	}

	void sayHi(){
		System.out.println("Hi!" + this.name);
	}
}

class AdminUser extends User{
	AdminUser(String name){
		super(name);
	}

	void sayHi(){
		System.out.println("[admin] Hi!" + this.name);
	}

}

public class MyApp {
	public static void main(String[] args){
		User tom = new User("tom");
		User.sayHi();
		AdminUser bob = new AdminUser("bob");
		AdminUser.sayHi();
	}
}

abstract

abstract class User {
	public abstract void sayHi();
}

class JapaneseUser extends User {
	@Override
	public void sayHi(){
		System.out.println("こんにちは!");
	}
}

class AmericanUser extends User {
	@Override
	public void sayHi(){
		System.out.println("Hi");
	}
}


public class MyApp {
	public static void main(String[] args){
		AmericanUser tom = new AmericanUser();
		JapaneseUser aki = new JapaneseUser();
		tom.sayHi();
		aki.sayHi();
	}
}

interface

interface Printable {
	// 定数
	// 抽象メソッド default, static
	double VERSION = 1.2;
	void print();
	public default void getInfo(){
		System.out.println("I/F ver. " + Printable.VERSION);
	}
} 

class User implements Printable{
	@Override
	public void print(){
		System.out.println("Now printing user profile...");
	}	
}


public class MyApp {
	public static void main(String[] args){
		User tom = new User();
		tom.print();
		tom.getInfo();
	}
}

列挙型

enum Result {
	SUCCESS,
	ERROR,
}

public class MyApp {
	public static void main(String[] args){
		Result res;

		res = Result.ERROR;

		switch (res){
			case SUCCESS:
				System.out.println("OK!");
				System.out.println(res.ordinal());
				break;
			case ERROR:
				System.out.println("NG!");
				System.out.println(res.ordinal());
				break;
		}
	}
}

[jdk14.0.2] 基礎1

compile
$ javac MyApp.java
$ java MyApp

basic

public class MyApp {

	public static void main(String[] args){
		System.out.println("Hello world!");
	}
}

variable

String msg;
		msg = "Hello world!";
		System.out.println(msg);

variable
L primitiveなデータ型はメモリ領域を確保する
L String, arrayなど参照型はメモリの番地を確保して、番地を参照している

public static void main(String[] args){
		// String, char
		char a = 'a';
		// byte short int long
		int x = 10;
		long y = 55555555L;
		// 浮動小数点数 float double
		double d = 23423.334;
		float f = 32.33F;
		// 論理値
		boolean flag = true;
		// \n
		String msg = "Hello wo\nr\tld";
		System.out.println(msg);
	}
int i;
		i = 10 / 3;
		System.out.println(i);
		i = 10 % 3;
		System.out.println(i);
		int x = 5;
		x++;
		System.out.println(x);
		x--;
		System.out.println(x);

cast

double d = 52343.213;
int i = (int)d;

		int i = 10;
		double d = (double)i / 4;
		System.out.println(d); 

if

		int score = 85;
		if(score > 80){
			System.out.println("great");
		} else if (score > 60){
			System.out.println("good"); 
		} else {
			System.out.println("soso"); 
		}

		int score = 25;
		String msg = score > 80 ? "great!": "soso ...!";
		System.out.println("soso");

switch

		String signal = "red";
		switch(signal) {
			case "red":
				System.out.println("stop!");
				break;
			case "blue":
				System.out.println("go!");
				break;
			case "yellow":
				System.out.println("caution!");
				break;
			default:
				System.out.println("wrong signal!");
				break;
		}

while

		int i = 0;
		while(i < 10){
			System.out.println(i);
			i++;
		}

		do {
			System.out.println(i);
			i++;
		}while(i < 10);

for

for(int i = 0; i < 10; i++) {
			if (i == 5){
				continue;
			}
			System.out.println(i);
		}

配列

		int[] sales;
		sales = new int[3];

		sales[0] = 100;
		sales[1] = 200;
		sales[2] = 300;

		System.out.println(sales[1]);

		sales[1] = 1000;
		System.out.println(sales[1]);

		sales = new int[] {100, 200, 300};
		int[] sales = {100, 200, 300};

		int[] sales = {100, 200, 300};

		for(int i = 0; i < sales.length; i++){
			System.out.println(sales[i]);
		}

		for (int sale : sales){
			System.out.println(sale);
		}

基本データ型と参照型

		int[] a = {3, 5, 7};
		int[] b = a;
		b[1] = 8;
		System.out.println(a[1]);
		System.out.println(b[1]);

		// 文字列の場合は、別の領域にメモリを確保する
		String s = "hello";
		String t = s;
		t = "world";
		System.out.println(s);
		System.out.println(t);

method

	public static void sayHi(String name){
		System.out.println("Hi!" + name);
	}

	public static void main(String[] args){
		sayHi("Tom");
		sayHi("Bob");
	}

	public static String sayHi(String name){
		return "hi!" + name;
	}

	public static void main(String[] args){
		String msg = sayHi("Steve");
		System.out.println(msg);
	}

	// overload
	public static void sayHi(){
		System.out.println("Hi! Nobody!");
	}

	public static void main(String[] args){
		sayHi("Steve");
		sayHi();
	}

class

class User {
	String name = "Me!";

	void sayHi(){
		System.out.println("Hi!");
	}
}

public class MyApp {

	public static void main(String[] args){

		User tom;
		tom = new User();

		System.out.println(tom.name);
		tom.sayHi();
	}
}

constructor
L thisはclassのcontructorという意味

class User {
	String name;

	User(String name){
		this.name = name;
	}

	void sayHi(){
		System.out.println("Hi!" + this.name);
	}
}

public class MyApp {

	public static void main(String[] args){

		User tom;
		tom = new User("Tom");

		System.out.println(tom.name);
		tom.sayHi();
	}
}

継承

class AdminUser extends User{
	AdminUser(String name){
		super(name);
	}

	void sayHello(){
		System.out.println("Hello!" + this.name);
	}

}

public class MyApp {

	public static void main(String[] args){

		User tom;
		tom = new User("john");

		System.out.println(tom.name);
		tom.sayHi();

		AdminUser bob = new AdminUser("bob");
		System.out.println(bob.name);
		bob.sayHello();
	}
}

[openjdk-14] ubuntu20.04にopenjdkをinstallする

$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”20.04.1 LTS (Focal Fossa)”

$ sudo apt search openjdk-\(\.\)\+-jdk$
Sorting… Done
Full Text Search… Done
openjdk-11-jdk/focal-updates,focal-security 11.0.9+11-0ubuntu1~20.04 amd64
OpenJDK Development Kit (JDK)

openjdk-13-jdk/focal-updates 13.0.4+8-1~20.04 amd64
OpenJDK Development Kit (JDK)

openjdk-14-jdk/focal-updates 14.0.2+12-1~20.04 amd64
OpenJDK Development Kit (JDK)

openjdk-8-jdk/focal-updates,focal-security 8u272-b10-0ubuntu1~20.04 amd64
OpenJDK Development Kit (JDK)

$ sudo apt install openjdk-14-jdk
$ java -version
openjdk version “14.0.2” 2020-07-14
OpenJDK Runtime Environment (build 14.0.2+12-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 14.0.2+12-Ubuntu-120.04, mixed mode, sharing)
$ javac -version
javac 14.0.2

[google analytics] APIでアクセス数を取得したい

1. Google Dev ConsoleでAnalytics APIを有効にします。

認証情報を作成

– サービスアカウントの作成
L p12の秘密鍵を作成

– Google analyticsの対象のサービスに権限の追加でコンソールで作成したメールアドレスを追加
L 項目は表示と分析

$ git clone -b v1-master https://github.com/google/google-api-php-client.git

app.php

require_once 'google-api-php-client/src/Google/autoload.php';
$service_account_email = 'myapp-***@analytics-hoge.iam.gserviceaccount.com';
$key = file_get_contents('analytics-fugafuga.p12');
$profile = '***';

$client = new Google_Client();
$analytics = new Google_Service_Analytics($client);

$cred = new Google_Auth_AssertionCredentials(
	$service_account_email,
	array(Google_Service_Analytics::ANALYTICS_READONLY),
	$key
);

$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()){
	$client->getAuth()->refreshTokenWithAssertion($cred);
}

$result = $analytics->data_ga->get(
	'ga:' . $profile,
	'7daysAgo',
	'yesterday',
	'ga:sessions,ga:pageviews'
);

echo $result -> rows[0][0] . "\n";
echo $result -> rows[0][1] . "\n";

$ php app.php
*****
*****

人気記事の取得も配列を使ってできるようです。
なるほど、割と簡単に実装できますね。

[PHP 7.4.11] MySQLにCSVインポートする

### dbとテーブルの作成
mysql> create database myapp;
mysql> use myapp;
mysql> create table users(
-> id int primary key auto_increment,
-> name varchar(255),
-> sports varchar(255)
-> );

nameとsportsを入れたcsvファイル(users.csv)を作成します。

### pdoの確認
$ php -i|grep PDO
PDO
PDO support => enabled
PDO drivers => mysql, sqlite
PDO Driver for MySQL => enabled
PDO Driver for SQLite 3.x => enabled

### csv.php

ini_set('display_errors', 1);

try {
		$pdo = new PDO('mysql:host=localhost;dbname=myapp;charaset=utf8','root','****',
				array(PDO::ATTR_EMULATE_PREPARES => false));
	} catch (PDOException $e){
		exit('データベース接続失敗.'.$e->getMessage());
	}

$fp = fopen("users.csv", "r");

while(! feof($fp)){
	$csv = fgets($fp);
	$csv = trim($csv,'"');
	$csv = mb_convert_encoding($csv, "UTF-8", "utf-8");
	$csv = str_replace('"','',$csv);
	$csv_array = explode(",",$csv);

	$stmt = $pdo->prepare("INSERT INTO users(name, sports) VALUES(:name, :sports)");

	$stmt->bindParam(':name', $csv_array[0],PDO::PARAM_STR);
	$stmt->bindParam(':sports', $csv_array[1],PDO::PARAM_STR);
	$stmt->execute();
}

echo "insert done";

$ php csv.php
insert done

mysql> select * from users;
+—-+—————–+—————-+
| id | name | sports |
+—-+—————–+—————-+
| 1 | name | sports
|
| 2 | Efa Trujillo | Gynastics
|
| 3 | Erica Werner | Rowing
|
| 4 | Amin Guerrero | Wiffleball
|
| 5 | Abbie Bender | Rugby
|
| 6 | Kamron Mcneill | Surfing
|
| 7 | Arabella Sutton | Basketball
|
| 8 | Emily Kerr | Curling
|
| 9 | Connar Small | Ice skating
|
| 10 | Haidar Fletcher | Figure skating |
+—-+—————–+—————-+
10 rows in set (0.00 sec)

1行目からinsertされてしまうので、1行目は抜かす必要がありますね。

[CSS] スマホで見た時に、下固定のメニューを表示させたい

ヤフオクとかでもそうだが、SP表示の際に下に固定メニューを表示させたい。
イメージとしてはこんな感じ。

<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<link rel="stylesheet" href="styles.css" type="text/css">
</head>
<body>
	<h1>Test</h1>
	<div id="sp-fixed-menu" class="for-sp">
		<ul>
			<li><a href="#">お買い得品</a></li>
			<li><a href="#">セール品</a></li>
			<li><a href="#">カート</a></li>
		</ul>
	</div>
</body>
</html>
#sp-fixed-menu {
	position: fixed;
	width: 100%;
	bottom: 0px;
	font-size: 0;
	opacity: 0.9;
	z-index: 99;
}

#sp-fixed-menu ul {
	display: flex;
	list-style: none;
	padding: 0;
	margin: 0;
	width: 100%;
}

#sp-fixed-menu li {
	justify-content: center;
	align-items: center;
	width: 50%;
	padding: 0;
	margin: 0;
	font-size: 14px;
	border-right: 1px solid #fff;
}

#sp-fixed-menu li:first-child {
	background: #38b435;
}
#sp-fixed-menu li:nth-child(2) {
	background: #38b435;
}
#sp-fixed-menu li:last-child{
   background: #f3a324;
}

#sp-fixed-menu li a {
	color: #fff;
	text-align: center;
	display: block;
	width: 100%;
	padding: 10px;
	padding-left: 0px;
}

/* spのみ表示 */
@media (min-width: 768px){
	.for-sp {
		display: none;
	}
}

OK
さーワイヤー書くか。
一日中ワイヤー書くと、疲労感が半端ないんだよなー。

[CSS] スクロールしても横固定のメニュー

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<header id="header"></header>
<main id="main">
	<h2>MAIN BLOCK</h2>
</main>

<aside id="sub">
	<h2>Menu</h2>
	<ul>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
	</ul>
	<h2>Menu</h2>
	<ul>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
	</ul>
	<h2>Menu</h2>
	<ul>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
		<li>Subject</li>
	</ul>
</aside>
</body>
</html>
body {
	margin: 0;
	padding: 0;
}
#header {
	box-sizing: border-box;
	background: #ccc;
	height: 50px;
}
#main {
	box-sizing: border-box;
	margin-left: 220px;
	padding: 20px 40px;
}
#sub {
	box-sizing: border-box;
	top: 50px;
	height: 100%;
	width: 220px;
	position: fixed;
	overflow: auto;
	background: #eee;
	padding: 20px;
}

OK, keep goin
出掛けよう

[jQuery] マウスのhoverで写真表示を変える

amazonの様にマウスでホバーするとメイン画像の表示を切り替えたい

hoverしたらメイン画像のsrcをreplaceする。

<body>
	<img src="img/item1.jpg" class="item" width="610px" height="420px"><br>
	<img id="item1" src="img/item1.jpg" width="200px" height="140px">
	<img id="item2"src="img/item2.jpg" width="200px" height="140px">
	<img id="item3" src="img/item3.jpg" width="200px" height="140px">
	<script
  src="https://code.jquery.com/jquery-3.5.1.js"
  integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc="
  crossorigin="anonymous"></script>
	<script>
		$('.item').each(function(){
			let img_off = $(this).attr('src');
			let img_on_2 = $(this).attr('src').replace('1', '2');
			let img_on_3 = $(this).attr('src').replace('1', '3');

			let item2 = document.getElementById('item2');
			let item3 = document.getElementById('item3');
			$(item2).hover(
				function(){
					$('.item').attr('src', img_on_2);
				},
				function(){
					$('.item').attr('src', img_off)
				});
			$(item3).hover(
				function(){
					$('.item').attr('src', img_on_3);
				},
				function(){
					$('.item').attr('src', img_off)
				});
		});
	</script>

</body>

ああ、これは作ってて面白いね。

[Vue.js]Selectの初期値をdataで渡す

注文数の個数の変更の箇所をinputではなく、selectにしたい

select文を作成して、vue.jsのdataでvalueをv-modelに渡せば良い

<body>
	<div id="app">
		<form>
			<select v-model="selected_item">
				<?php for($i=0; $i<10; $i++){
					echo "<option value='$i'>$i</option>";
				}
				?>
			</select>
		</form>
	</div>
	<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
	<script>

		const num = 5;

		var vm = new Vue({
			el: '#app',
			data: {
				selected_item: num,
			}
		});
	</script>

</body>
</html>

ずーと悩んでたけど、割と簡単にできたな🔥🔥🔥

### Vueと言えばこの本