UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY37-2 pixelaでのデータ更新&データ削除の方法

前回に引き続きpixelaの使い方の続き。

データの上書きと削除方法。

 

データの上書き

 

ドキュメントでのcurl操作は

$ curl -X PUT https://pixe.la/v1/users/a-know/graphs/test-graph/20180915 -H 'X-USER-TOKEN:thisissecret' -d '{"quantity":"7","optionalData":"{\"key\":\"value\"}"}'
{"message":"Success.","isSuccess":true}

 

エンドポイントの最後にアップデートしたい日付を追加して

jsonデータでquantityを更新したい数値に変更する。

オプショナルデータはよくわからないので(サポーター限定?)これは削除。

(グラフの色とかのオプションが変更できる?)

ドキュメントもまだ記載していない。

 

pythonで書くとこんな感じ。

params = {
"quantity": "30",
}
response = requests.put(
url=f"{PIXELA_ENDPOINTS}/{USERNAME}/graphs/{GRAPH_ID}/20220810",
headers=headers, json=params)
print(response.text)

これで昨日のポイント1が30に変更されました。

 

pixela

 

 

データの削除

これは簡単で、消したいコミットの日付をエンドポイントの一番最後に入れて

指示をdeleteにすればいいだけ。

 

response = requests.delete(
url=f"{PIXELA_ENDPOINTS}/{USERNAME}/graphs/{GRAPH_ID}/20220810",
headers=headers)
print(response.text)

 

 

pixela delete

 

これで消えました。

 

操作自体は結構簡単。

 

自分の使ってるSNSと連携して投稿とかツイートしたら草生えるような連携ができればいいな〜

 

 

DAY37-2 pixelaでのデータ更新&データ削除の方法

前回に引き続きpixelaの使い方の続き。

データの上書きと削除方法。

 

データの上書き

 

ドキュメントでのcurl操作は

$ curl -X PUT https://pixe.la/v1/users/a-know/graphs/test-graph/20180915 -H 'X-USER-TOKEN:thisissecret' -d '{"quantity":"7","optionalData":"{\"key\":\"value\"}"}'
{"message":"Success.","isSuccess":true}

 

エンドポイントの最後にアップデートしたい日付を追加して

jsonデータでquantityを更新したい数値に変更する。

オプショナルデータはよくわからないので(サポーター限定?)これは削除。

(グラフの色とかのオプションが変更できる?)

ドキュメントもまだ記載していない。

 

pythonで書くとこんな感じ。

params = {
"quantity": "30",
}
response = requests.put(
url=f"{PIXELA_ENDPOINTS}/{USERNAME}/graphs/{GRAPH_ID}/20220810",
headers=headers, json=params)
print(response.text)

これで昨日のポイント1が30に変更されました。

 

pixela

 

 

データの削除

これは簡単で、消したいコミットの日付をエンドポイントの一番最後に入れて

指示をdeleteにすればいいだけ。

 

response = requests.delete(
url=f"{PIXELA_ENDPOINTS}/{USERNAME}/graphs/{GRAPH_ID}/20220810",
headers=headers)
print(response.text)

 

 

pixela delete

 

これで消えました。

 

操作自体は結構簡単。

 

自分の使ってるSNSと連携して投稿とかツイートしたら草生えるような連携ができればいいな〜

 

 

DAY37 pixelaというAPIを使ってログアプリを作る!アカウント登録〜ログ記録まで

python再開して更新してみます。

 

今回はpixelaというAPIを使ってログをとるアプリを作ります。

 

pixe.la

 

 

製作者は日本人なのでget startedも日本語ドキュメントあってやりやすいかと。

 

アカウントを作成する

最初にアカウントを作成します。

リンク先の始め方だとcurlでの作業なので

pythonの書き方に変換すると、

 

import requests

pixela_endpoints = "https://pixe.la/v1/users"
secret_code = "tekitounisakuseisitekudasai"
username = "gakpy2"

# アカウント作成する初回だけ
params = {
"token":secret_code,
"username": username,
"agreeTermsOfService":"yes",
"notMinor":"yes"
}

response = requests.post(url=pixela_endpoints, json=params)
print(response.text)

 

このような感じになります。curlの-dはデータということで、

見てみるとjson形式になっているのでpythonでもparamsと定義したjsonデータに。

 

requestsモジュールをインポートして、curlの最初にあるとおりpostでresponseをもらう。

 

そうすると、pythonのコンソールでは同じような返事がテキストできます。

 

success

これでアカウントが作成されました。

 

ちなみにこれは1回だけしか使わないのでコメントアウトしておきます。

 

2回以上作動させてもこうなります。

 



グラフを作る

次にグラフを作ります。オフィシャルのcurlでは

$ curl -X POST https://pixe.la/v1/users/a-know/graphs -H 'X-USER-TOKEN:thisissecret' -d '{"id":"test-graph","name":"graph-name","unit":"commit","type":"int","color":"shibafu"}'
{"message":"Success.","isSuccess":true}

 

こんな感じになっているのですが、 -Hというのを検索してみるとpythonではjsonデータとは別にheaderでの設定がいるらしい。

 

pythonで書くのならこんな感じになる。


params = {
"id":"test-graph",
"name":"study-graph",
"unit":"commit",
"type":"int",
"color":"ichou",
"timezone":"Japan"
}
headers = {
"X-USER-TOKEN": SECRET_CODE
}

response = requests.post(url=f"{PIXELA_ENDPOINTS}/{USERNAME}/graphs", headers=headers, json=params )
print(response.text)

 

docs.pixe.la

 

タイムゾーンなどは追加した。詳しくは上記リンク先で。

 

登録が成功するとマイページはこんなふうになります。

 

グラフにログを記録する

そしてついにログを記録する方法に。

オフィシャルだとこんなcurlですが

$ curl -X POST https://pixe.la/v1/users/a-know/graphs/test-graph -H 'X-USER-TOKEN:thisissecret' -d '{"date":"20180915","quantity":"5"}'
{"message":"Success.","isSuccess":true}

 

見た感じ結構簡単ですね。

jsonデータは日付と質で、ヘッダーは毎回必ずいるようです。

 

今日はこの記事を1本書いたということで今日の日付で1を登録してみます。

headers = {
"X-USER-TOKEN": SECRET_CODE
}

params = {
"date": "20220810",
"quantity": "1"
}
response = requests.post(url=f"{PIXELA_ENDPOINTS}/{USERNAME}/graphs/{GRAPH_ID}", headers=headers, json=params)
print(response.text)

 

となると、

{"message":"Success.","isSuccess":true}で成功となりました。

 

マイページを見ると…

 

 

いろんなところに1が増えています。

これで今日のログ記録は完成しました。

 

とりあえず登録〜記録まではこんな感じです。

復習してみると思ったより簡単でした。

(なぜいままで躊躇して更新していなかったのか…)

 

8月目標

最近ブログ書けてないので月初めに目標をたてて遂行していこうかと。

 

8月目標

  1. Reactを使ってポートフォリオを作成(youtubeをみながら)
  2. 本業でjavascriptを使って勉強しつつ貢献する(アイデアはqiitaに書く)
  3. python記事も週1ペースでUdemyのを補完していく
  4. paizaに登録したのでランクを上げていく

 

実務未経験でpythonだけは求人も少なくて狭き門だと感じたので、

フロントエンドでReactとJavascriptを7月はやっていっていたのですが

今月はfirebaseとかを使ってreactでデプロイまでできればと計画中。

 

また客観的に評価をしてもらいたいのでfindyでのランク付以外にも

paizaを使ってランクを上げていく。

paizaの試験なんか質問がクセがないか?回答コードが簡単なんだけど

問題を理解するのに時間かかる笑

freeCodeCampで正規表現を勉強する!

引き続きfreeCodeCampで正規表現も勉強。

matchとかもそうだけどエディタで検索するときにも使えるので

正規表現は結構使えるとよさそう。

検索したい文字の後ろ/後にiをつけると大文字小文字関係なく検索してくれる
/後ろにgをつけると同じ文字が複数はいったらリストで返してくれる
let myString = "freeCodeCamp";
let fccRegex = /freeCodecamp/i;
let result = fccRegex.test(myString);
console.log(result);

 

スペルミスなどやある程度おおまかな検索をしたい場合は.をつける。

.testでしか使えない?

let exampleStr = "Let's have fun with regular expressions!";
let unRegex = /.un/;
let result = unRegex.test(exampleStr);

 

の中に検索したい文字を入れるとその文字があると出力される。
[aoe]ならa,o,eぞれぞれ検索してくれるし、[a-z]とかならアルファベット全てを検索してくれる。
数字も可能で両方合わせることも可能。/[a-c4-6]/giならabc、456を検索してくれる。
giなので大文字小文字どちらも、同じのもリストに入れてくれる。

 

let quoteSample = "Beware of bugs in the above code; I have only proved it correct, not tried it.";
let vowelRegex = /[aeiou]/gi;
let result = quoteSample.match(vowelRegex);

 

検索されないようにするには^を先に入れる。

/[^abe0-3]/gi

 

同じ文字が続く場合は検索したい文字の後ろに+をつけるとまとめて検索してくれる。
s+だとsが1個以上検索、sが2個以上の場合はss+を入力

let difficultSpelling = "Mississippi's";
let myRegex = /s+/g;
let result = difficultSpelling.match(myRegex);
console.log(result); //[ 'ss', 'ss', 's' ]を返す

 

後ろに何個ついてようが個数を気にせず検索する場合は*を使う

let soccerWord = "gooooooooal!";
let goRegex = /go*/;
soccerWord.match(goRegex);

 

^はの中にいれると検索されないようにする機能を持つが、[]がないと文章の最初という意味になる。
その検索文字が最後の場合は$を検索文字の後ろにつける。

 

let text = "Go to school";
let text2 = "school to go";
let regex = /^school/;
let regexLast = /school$/;

console.log(regex.test(text)); //false
console.log(regex.test(text2)); //true
console.log(regexLast.test(text)); //true
console.log(regexLast.test(text2)); //false

 

ショートハンド

 

[A-Za-z0-9_]を全て含むのがめんどくさい場合は/\w/だけでショートカットできる
この場合はアンダーラインも含む逆に含まない場合は大文字でショートカットできる/\W/

let quoteSample3 = "The five boxing wizards jump quickly.";
let alphabetRegexV2 = /\w/g;
let result3 = quoteSample3.match(alphabetRegexV2).length;

数字のみのショートカットは\d含まない場合は\DでOK

複雑なフィルター例
let username = "JackOfAllTrades";
let userCheck = /^[a-z][a-z]+\d*$|^[a-z]+\d\d+$/gi;
let result = userCheck.test(username);
最初はアルファベット2文字以上で最後が数字いくつでももしくは最初の1文字以上がアルファベットで最後が2つ以上の数字で終わる

スペースを検索する場合は\s含めない場合は\Sで
同じ文字がある範囲の数ある場合は検索したい文字の直後に{n,n}で検索できる
最後の数字を入れなかったらn以上となる{3,}=3以上
{3}とコンマもない場合はちょうど3つということになる
let sam = "Saaaaaaam";
let countA = /Sa{3,7}m/; //aが3~7個ある場合
let result2 = countA.test(sam);
console.log(result2);

 

 

?の使い方

?を直前の文字に入れるとその文字が0〜1個あれば検索対象に入る

let american = "color";
let british = "colour";
let rainbowRegex= /colou?r/;
rainbowRegex.test(american);
rainbowRegex.test(british);

(?=moji)で入力するとmoji部分が曖昧でも対象にしてくれる

let sampleWord = "astronaut";
let pwRegex = /(?=\w{6,})(?=\w*\d{2})/i;
let result = pwRegex.test(sampleWord);
console.log(result);

 

検索対象をグループしたい場合は()の中に入れる

let myString = "Eleanor Roosevelt";
let myRegex = /(Eleanor|Franklin D.)/;
let result = myRegex.test(myString);

特定しないがある文字数字の繰り返しを検索したい場合は/(\w+)/でできるまたそれを繰り返したい場合 \1 で繰り返しができる
単語を指定しなくていいので汎用性がある
(\w+)は変数みたいなもので.replaceとかで使いたい場合は$1,$2で対応できる

let repeatRegex = /(\w+) \1 \1/;
repeatRegex.test(repeatStr); // Returns true
repeatStr.match(repeatRegex); // Returns ["row row row", "row"]
matchで使うとリストで出力されるが1つ目が検索されたもの、2つ目が検索された単語を出力してくれる

let repeatNum = "42 42 42";
let reRegex = /^(\d+)\s\1\s\1$/; // 確実に数字が3つ、間に半角スペースがあるものを検索してくれる
let result = reRegex.test(repeatNum);

 

検索したものを変更したい場合は.replaceを使う。正規表現と合わせて使う

let str = "one two three";
let fixRegex = /^(\w+)\s(\w+)\s(\w+)$/; // one=$1, two=$2, three=$3となる
let replaceText = "$3 $2 $1"; // ""をの中にいれる
let result = str.replace(fixRegex, replaceText); //three two one

最初と最後のスペースを削除する方法
let hello = " Hello, World! ";
let wsRegex = /^\s+|\s+$/g; // 最初と最後に1つ以上のスペースがあれば抽出する
let result = hello.replace(wsRegex, ""); // 抽出したスペースを全てなくす
console.log(result);

 

 

 

 

freeCodeCampでjavascriptを勉強する!ES6編

javascriptの基礎からES6も勉強。

アロー関数とか「なにこれ?」状態だったので、

今回これを勉強できてかなりためになった。

無料というのがすごい。

 

function部分の省略

 

functionは省略できる
const myFunc = function() {
const myVar = "value";
return myVar;
}
これをES6にすると
const myFunc = () => {
const myVar = "value";
return myVar;
}
となるさらにfuctionの中身がreturn xxx;だけの場合はさらに省略できる
const myFunc = () => "value";
()部分に引数をいれて少し複雑なreturnも可能
const myConcat = (arr, arr2) => arr.concat(arr2);
()部分の引数にはデフォルトを設定することが可能
const increment = (num, val = 1) => num + val;
increment(1,4);

 

引数が固定でない場合でも対応できるargumentオブジェクト

()部分には...argsが使える引数が固定でない場合に有効
const sum = (...args) => args.reduce((a,b) => a + b, 0);

...argsは配列を展開してくれる役目も持つ
const arr1 = [1,2,3,4,5];
const arr2 = [3,4,5];
const arr1args = [...arr1];
const arr2args = [...arr2];
console.log(arr1);
console.log(arr2);

 

同じオブジェクトで複数を定義する場合このように省略できる
元データソース
const HIGH_TEMPERATURES = {
yesterday: 75,
today: 77,
tomorrow: 80
};

省略記述
const {today ,tomorrow} = HIGH_TEMPERATURES;
別の名前に定義することもできる
const {today: highToday, tomorrow: highTomorrow} = HIGH_TEMPERATURES;

入れ子になっている場合でも複数定義できる
const LOCAL_FORECAST = {
yesterday: { low: 61, high: 75 },
today: { low: 64, high: 77 },
tomorrow: { low: 68, high: 80 }
};
const {today: {low: lowToday2, high: highToday2 }} = LOCAL_FORECAST;
// lowToday2 = 64, highToday2 = 77 という2つの引数ができる


 

 

ES6ではテンプレートリテラルが使える

pythonでいうprint(f"{name} is {age}")みたいなもの

 
ES6の場合は``を使うバックティック (クオート'',""ではない
const result = {
success: ["max-length", "no-amd", "prefer-arrow-functions"],
failure: ["no-var", "var-on-top", "linebreak"],
skipped: ["no-extra-semi", "no-dup-keys"]
};
function makeList(arr) {
// Only change code below this line
const failureItems = [];
for (let i = 0; i < arr.length; i++){
failureItems.push(`<li class="text-warning">${arr[i]}</li>`);
}
// Only change code above this line
return failureItems;
}
const failuresList = makeList(result.failure);
console.log(failuresList);


 

 

ファンクションの変数と引数が同じ場合は省略できる。
const createPerson = (name, age, gender) => {
// Only change code below this line
( return {
name: name,
age: age,
gender: gender
};)
// Only change code above this line
};この場合


const createPerson = (name, age, gender) =>
// Only change code below this line
({name, age, gender});
// Only change code above this line
のように省略できる

 

 

オブジェクト内でのファンクションの省略
const person = {
name: "Taylor",
sayHello: function() {
return `Hello! My name is ${this.name}.`;
}
};
省略すると
const person2 = {
name: "Taylor",
sayHello() {
return `Hello! My name is ${this.name}.`;
}
};

 

 

class表記ができるように
class SpaceShuttle {
constructor(targetPlanet) {
this.targetPlanet = targetPlanet;
}
}
const zeus = new SpaceShuttle('Jupiter');

 

classを使う時は最初にconstructorを記述して初期値を設定する。

pythonでいうdef __init__みたいなもの

 

 

type="module"で外部jsをインポートができる
es6だと他のjsファイルからモジュールとして追加ができるようになる
typeをmoduleにするだけでimportができるようになる?

<script type="module" src="filename.js"></script>

exportするjsには最後にexport{exportする変数・引数}を入れる
const uppercaseString = (string) => {
return string.toUpperCase();
}
const lowercaseString = (string) => {
return string.toLowerCase()
}
export { uppercaseString, lowercaseString};

ファイルの一つの返しのみをインポートする場合は
export default をつける reactでもやってた

export default function (x, y) {
return x - y;
}
名前付きでもOK
export default function add(x, y) {
return x + y;
}

importは{}なしでもいけるちょっとpython
import add from "./sample.js";

 

promise文で処理を変えたり順序を変更できるようになる


Promise((resolve,reject) => {})のあとにしたい処理があったら
最後に.then(result => {処理});を追加するとできる
Promiseでrejectになった時どうするかの処理は
.catch(error => {console.log("エラーが発生しました")})みたいな感じで追加できる
pythonでいうtry exceptみたいな感じかと思う

 

ES6は特に覚えたかった部分のjsなので、だいぶ勉強になりました。

 

FreeCodeCampでjavascriptを勉強して簡単にまとめてみる。

一通りpythonの基礎はできてきたかなと思って求人を色々見ていると

関西とかでは実務なしのpythonエンジニアはかなり狭き門と感じたので、

フロントエンドもかじってみようとjavascriptも始めることに。

 

書き方はpythonと似たようなところがあるのでそんなに違和感なくできてる感じです。

とりあえず無料でもしっかり勉強できそうなところで

英語がメインではありますがfreeCodeCampで初歩からスタート。

https://www.freecodecamp.org/learn

 

 

とりあえず基礎をメモ的にまとめてみる。

変数定義

前はvarを使っていたがローカルにおいてもグローバルに使えてしまってややこしいので

今はletやconstを使う。

letは定義したものは変更できるけど、

constは基本的にはできない。(配列を定義した場合、配列内のデータは変えられる)

 

for文、while文、do while文

for文はほぼpythonにも似てる感じ。

let jsnum = 0;
for ( let i = 0; i < 10; i++) {
jsnum = i++;
}
console.log(jsnum);

 

pythonなら

pynum = 0
for i in range(10):
pynum += 1
print(pynum)


while文

js

let jsnum = 0;

while(jsnum < 10) {
jsnum += 1;
}
console.log(jsnum);

 

python

pynum = 0
while pynum < 10:
pynum += 1
print(pynum)

 

jsにはdo whileというwhileに入る前に1回whileの処理ができる構文がある

let jsnum = 0;

do {
jsnum += 1;
console.log(jsnum);
}
while(jsnum < 10);
console.log(jsnum);

 

再起関数

pythonではわからなかったけどjsで勉強してようやくわかった。

関数の中に自身の関数を入れてforを使わず回転させる。


function arrayLength(array) {
if(_.isEmpty(array)) { // isEmpty : 配列要素が空ならtrueを返す
return 0;
} else {
return 1 + arrayLength(_.rest(array)); // rest : 配列から先頭要素を除いた配列を返す
}
}
arrayLength(nums); // 5

複数のループもできる
function countdown(n) {
if (n < 1) {
return [];
} else {
const arr = countdown(n - 1);
arr.unshift(n);
return arr;
}
}
 
function rangeOfNumbers(startNum, endNum) {
if (endNum - startNum === 0) {
return [startNum];
} else {
const arr = rangeOfNumbers(startNum, endNum - 1);
arr.push(endNum);
return arr;
}
};

rangeOfNumbers(1,4); // [1,2,3,4]が出力される
 

 

 

if elseを使わず分岐ができる 構文

if/elseを使わずtrueかfalseで動作を分けたい場合は? a :b でできる
return a > b ? "a is true": "b is false";
条件は複数追加することも可能
function checkSign(num) {
return (num == 0) ? "zero" : (num > 0) ? "positive" : "negative";
}
checkSign(10);

 

 

時々出てきたこの構文よくわかってなかったけどこれで納得。

 

 

その他よく使うファンクション
.push()は配列を最後に追加
.pop()は配列の最後のデータをとる
.shift()は最初のデータをとる
.unshift()はデータを配列一番最初に追加する
a.concat(b) 配列a,bを結合する
const sumWithInitial = array1.reduce*1; // 19

 

 

freeCodeCampで無料でここまで勉強できるのはすごい!

英語もそんなに難しい英語じゃないのでやりやすいと思います。

 

次はES6まとめ。

 

 

 

*1:previousValue, currentValue) =>

previousValue + currentValue, initialVal);
// reduceは対象の配列を取得して、順番に計算する例えばarray1 = [3,4,5]の場合
// 今回は3 + 4 + 5=12を出力する、
// 別にデフォルト数値をinitialValの部分で決められる。なくても動く
const map1 = a.map(x => x + 1); // aが配列[1,3,4]だとしたら配列にある数値を全て取得して
// 例の場合それぞれ+1をする map1は[2,4,5]となる

Math.random()で0〜1の間の小数点でランダムに数字を出す 0,4984320493094とか
Math.floorは小数点をカットする

parseInt()はstringの数を整数に治す parseInt(n, 2)にすると二進法で変換される
function convertToInteger(str) {
return parseInt(str, 2);
}
console.log(convertToInteger("10011"