プログラミングは面白い

プログラミングの事を中心に色々書いていきます

Goに苦しむ日々

さて、開発にアサインされて早くも3ヶ月が経ちました。
最初は本当にコードをさっぱり追えず、何をしてるのかわかりませんでした。
まぁ言い訳をするならば、それまではPHPをメインに勉強をしていたわけで、
いきなりGoやVueを理解できるわけないわけで。

Goにもだいぶ慣れてはきましたけど、それでもまだまだわからないことだらけ。
やっとポインタの概念は分かってきたかな?
それでもやっぱり???となる事あるけども。

今日は出来そうで出来ない、Goのハマったポイントを備忘録として残しておきます。

型が構造体のスライスと、string型のスライスの中身をappendする方法です。
わかると、何でこんなのでハマってたんだろう?となるんですけどね。
悔しい限りです。

package main
import "fmt"
func main(){
    
    type Test struct {
        ID string
    }
    
    var tes []Test
    array := []string{"1", "2", "3", "4", "5"}
    
    for _, v := range array {
        tes = append(tes, Test{v})
    }
    
    fmt.Printf("%+v\n", tes)

    // [{ID:1} {ID:2} {ID:3} {ID:4} {ID:5}]

}

これだけです。
割と基本ぽいですね。
何が分からなかったのか覚えてないのですが、この処理がうまく出来ずハマってました。
まだまだですね。

あ、それとブログタイトル変えました。
pythonから始まった私のエンジニア人生ですが、恐らく今後、触ることはあまりないかなーと...
PHPも今やってないし、今後もまた言語変わるかもしれないので。

私の様に高年齢でエンジニアを目指す人はきっと世の中にたくさんいるでしょう。
そんな人達に少しでも希望を持ってもらえるようなブログにしたいですね。

今一人、本当にエンジニアになれるのか不安を抱えながら独学をしているそこのアナタ。

大丈夫、頑張っていれば必ずエンジニアになれます。
1ミリでもいいので、昨日よりも成長しましょう。
その積み重ねがきっと大事。

とまぁ、駆け出しの私が偉そうに語ることではないんですけども。
寝よ

開発にアサインされて一月半が経ちました。思ったより地獄です

12月に受託開発に無事アサインされました。
しかし、思ったよりも開発現場は地獄…
決して炎上しているわけでもないし、計画通りに進んでいます。
何が地獄かと言えば、”とにかく何も出来ない”ことが地獄…。

何も経験がないので当たり前なのは分かっています。
ですが、今まで仕事をしてきて、ここまで足を引っ張る経験がなかったのでツライ…
何か質問をすれば、先輩エンジニアの手を止めてしまう。
しかし、質問しなければ先に進まない…
このジレンマがほんとキツイ。

開発言語はGoとVueです。
12月は主にフロント側の改修を担当し、1月からはサーバー側も触り始めました。

今まで独学で学んでいた事は何だったのだろう…と言うくらい、圧倒的無力…
Goでは聞いたこともないアーキテクチャを採用していて、何がどうなってるのかキャッチアップするのが大変でした。
今は多少、どんな形で実装しているのか徐々にわかってきましたが…
しかし無力…

てことで、VueとGoを使ってアプリを作ることにしました。
極力、今の開発に似せて作ってみます。
正直、簡単なアプリなのでVuexとか、大規模開発で使用するようなアーキテクチャは不要なのですけど、まぁ勉強ということで。

で、さっそく画面側でわからない事が発生し、無事に解決したので備忘録として書いておきます。
まず、わからなかったことは、コンポーネント化したモーダルを、別コンポーネントから呼び出す方法がわからなかったのです。
BootStrapを使用しているので、こいつの書き方も理解しないとなりません。
他にもやり方はあるのでしょうが、簡単なBootStrapとVueを使用したモーダルの開閉方法です

まず、VueでBootstrapが使えるように準備をしましょう。
このページ見れば導入は出来ると思います。
Bootstrap を Vue.js で使ってみよう - Qiita

導入が終わりましたら、testmodal.vueというモーダルコンポーネントと、
それを呼び出すtop.vueというコンポーネントを作成します。
まずはtestmodal.vueからです。

<div>
   <b-modal id="modal-1" title="BootstrapVue">
      <p class="my-4">Hello from modal!</p>
  </b-modal>
</div>

このページはBootStrapの公式そのままのコードです。
モーダルを開くボタンはtestmodal.vueに必要ないので削除してあります。
Modal | Components | BootstrapVue

んで、次にTop.vueです。

<template>
    <div>
  <b-button v-b-modal.modal-1 variant="danger">モーダルOPEN</b-button>
  <TestModal></TestModal>
    </div>
</template>

<script>
import TestModal from '@/components/testmodal'
export default {
    components: {
        TestModal
    },
}
</script>

これで完了です。
コンポーネントでは、testmodal.vueを使えるようにインポートし、
モーダルを開くボタンを設置するだけです。
top.vueにある、

v-b-modal.modal-1

がミソなのかな?
v-b-modalディレクティブを使用して、子コンポーネントのIDと紐づけているようです。
あとはBootstrap側でよろしくやってくれるみたいですね。
まずは基本的なことを一つ一つ理解していこう…

Vueもやりたいし、JavaScriptもやりたいし、Goもやりたいし、やりたいこと一杯。
地道にコツコツ頑張ろう。

※もし間違っていたらごめんなさい。

久しぶりに…

ブログを書いてみます。

さて、転職をして約1年が経ちました。
相変わらずPHPはやっていますが、アサインされた現場がヘルプデスクでした…
まぁ仕事に不満はないし、今までよりもNWに強くなれたのは収穫です。
しかし、肝心なエンジアとしての経験はまだまだ皆無。

現場で自分が使う、簡単なシステムをPHPで作ったり、
LAN内でサーバー建てて公開してみたり、みたいな事はできるようになりました。
けど、やっぱりそれは"開発経験"とは見られないわけで。

てことで、社長に直訴して今の現場を外してもらい、
開発現場にアサインしていただける流れになりました。
とはいえ、12月くらいからかな?
しかし今はPHPの案件がないようで、Go言語ならワンチャンあるかも、
とのことだったので一昨日からGoを勉強してます。

今までPHPだったので型を指定する機会が全然なかったのですが、
Goは型指定が必要だったり、そもそもコンパイル言語なのでササっと反応が見れるPHPと比べると少し面倒が多いです。
ポインタの概念もややこしいし、恩恵がまだわかりません。
GoでWebアプリ作ってみたいな。
やっぱりWeb系が好き。

PHPもやりつつ、Goも頑張る。

MDB2のお勉強

今どきMDB2なんか使われてないと思うのですが、問題として出てくるので覚えなくてはなりません。
PHPの歴史を勉強していると思って頑張ります。

6-3 SQL文の実行に関する問題
INSERT文、UPDATE文、DELETE文を実行した場合は結果セットは生成されない。「作用した行数」は得られる。

6-8 MDB2におけるSELECT文の結果取得方法に関する問題
MDB2クラスのqueryOne()メソッドはSELECT文を実行し、結果の1行目、1列目の値を取り出す。
MDB2クラスのqueryRow()メソッドはSELECT文を実行し、結果の最初の行を取り出し返す。
MDB2クラスのqueryCol()メソッドはSELECT文を実行し、結果の列の値を配列にして返す。
MDB2クラスのqueryAll()メソッドはSELECT文を実行し、結果を2次元配列で返す。

queryRow、queryAllにはフェッチモードを渡せる。
フェッチモードが何のかよくわかっていない。
MDB2_FETCHMODE_ORDERED → 結果セットの列と同じ並び順のインデックス配列
MDB2_FETCHMODE_ACCOC → 結果セットの列名をキーとする連想配列
MDB2_FETCHMODE_OBJECT → 結果セットの列名をフィールドとするstdClassのインスタンス

queryOne、queryRow、queryCol、queryAllの使用例

<?php
require_once('MDB2.php');

$db = MDB2::connect('mysql://localhost/test') //testDBなのでID、PASS省略  
$db->exec('DROP TABLE IF EXISTS t');
$db->exec('CREATE TABLE t (a INT b INT)');
$db->exec('INSERT INTO t VALUE (1, 10), (2, 20)');

echo "queryOne()";
echo $db->queryOne('SELECT b FROM t WHERE a = 1');

echo "\nqueryRow()";
print_r($db->queryRow('SELECT * FROM t WHERE a =1'));

echo "\nqueryCol()";
print_r($db->queryCol('SELECT a FROM t'));

echo "\nqueryAll()";
print_r ($db->queryAll('SELECT * FROM t'));
出力結果

queryOne():
10

queryRow():
Array
(
  [0] => 1
  [1] => 10
)

queryCol():
Array
(
  [0] => 1
  [1] => 2
)

queryAll():
Array
(
  [0] => Array
    (
       [0] => 1
       [1] => 10
    )
  [1] => Array
    (
       [0] => 2
       [1] => 20
    )
)

PHP上級資格を取るべく勉強中

えー、年の瀬ですが私は試験勉強の為に机に向かって唸っています。
PHPの上級資格を取得するために今更ながらPHP5の勉強をしなくてはならないという…
どうせ勉強するならPHP7がいいのですが、まぁPHP7でも使える技術は沢山あるので無駄ではないでしょう。
まずは準上級を狙っています。ちなみに初級試験は2週間くらい勉強したらサクっと取れました。
上級試験はあまりにも難しすぎて合格者が少ないために、いつからか正答率50%以上~70%未満には準上級資格が得られるようになったそうです。
たぶん、今の勉強時間だと上級を受かるのは難しそうです。てか、未経験で上級受かるのはかなりキツイらしいです。
てことで、せっかくブログもやってますし、今後、おもむろにアウトプットをしていこうと思います。
教材は黒本と呼ばれてる問題集を中心に勉強しています。
ちょっと中途半端ですが、5章の問題から気になる部分をアウトプット。

5-2 $_SERVERに関する問題
$_SERVER["REQUEST_METHOD"]にはGET、POST等が設定される。
$_SERVER["PATH_INFO"]にはパス情報が設定される。
$_SERVER["REQUEST_URI"]にはホスト名(ドメイン)以降が設定される。クエリ文字も含まれる。
$_SERVER["SCRIPT_NAME"]にはパス名とファイル名が設定される。
$_SERVER["REMOTE_HOST"]には現在のページにアクセスしているホストIP(IPアドレスを逆引きしたもの)が設定されるが、サーバーの設定や逆引きしていないIPの場合は取得出来ない。
$_SERVER["HTTP_USER_AGENT"]にはブラウザ情報が設定される。User_Agentヘッダがあれば設定される。
例)
http://example.test/php/foo.php/bar?a=b

$_SERVER["PATH_INFO"]/bar
$_SERVER["REQUEST_URI"]/php/foo.php/bar?a=b
$_SERVER["SCRIPT_NAME"]/php/foo.php
$_SERVER["PHP_SELF"]/php/foo.php/bar
$_SERVER["QUERY_STRING"]a=b

5-5 magic_quotes_gcpに関する問題
addslashes()エスケープしたものを元に戻すにはstripslashes()で処理する。

5-6 フォームパラメータに関する問題
GETリクエストの場合、パラメータはクエリ文字で送信され、$_GET配列に設定される。パラメータ名がキーになる。
HTMLのパラメータ名にピリオドやスペースがあるとアンダースコアに変換される。
<input name="a.b" value="1" type="text"> → キーはa_bに変換される

<input name="a_b" value="1" type="text">
<input name="a.b" value="2" type="text">
上記の場合、パラメータの値は2になる。
最初にキーa_bに値1がセットされるが、a.bがa_bに変換されるため、最初の値1のa_bが上書きされて2になる。

5-8 フォームでの複数選択の処理に関する基本的な問題
複数の項目を選択出来るフォームではHTMLフォームのパラメータ名の最後に[]をつける必要がある。

5-11 入力チェックに関する問題
strspn()は第一引数に渡した文字列の中の先頭から何文字目までが第二引数で指定した文字かが分かる。
strspn("38", "1234567890")の場合は2が返ってくる。
ctype_digit関数は与えられた文字列の全てが半角数字か判定する。ただし、""で囲った文字列でないとfalseが返ってくる。

とまぁ、こんな感じでアウトプットしていく。
しかし未経験者には難しい問題ばかり。

タイトル変えました

久しぶりのブログ。
さて、私は転職をし、Javaを頑張るんだーと思っていたのですが、PHPも新たに選択出来るようになったので私はPHPを選びました。
もう全然Pythonやってないけど、プログラミングの入りがPythonだったのでその冠は残しておきます。

いまはPHPの資格取得をするために日々勉強中です。
全然実践的じゃないけど学べる事は多いです。

何事も一歩一歩確実に前に進まなくては。
てことで、ブログ名変わったよってだけの記事ですたー。

最近はJava

内定を頂きまして、10月初旬を目安に就業予定の私ですが、Javaのお勉強をしています。
お世話になる会社では研修でJavaの勉強をするそうなので予習です。

実は私は結構前から喉に違和感があり、何か飲み込むと痛みを感じていました。
食べ物を飲み込むときは多少なのですが、飲み物の時はそこそこ痛いです。

結構前に一度病院で診てもらった時は、鼻からカメラを突っ込まれ喉に腫瘍があるか調べてもらったのですが、特に何も見つかりませんでした。
何もなければないで心配だったのですが、今回転職が決まった事もあり、再度病院に行って検査をしました。
最初は同じように鼻からカメラを突っ込まれて喉を診てもらったのですが、やはり何もなし。
心配だったのでCTもお願いをして撮ったのですが、やはり腫瘍は見つからず。
どうやらこのような症状を咽喉頭異常感症、別名ヒステリー球と言う病状に分類されるようです。
原因は自律神経の乱れだったり、心因的な問題だったり、要するに原因不明らしいです。
ちなみに、私は小学生の頃から自律神経失調症って言われた事ありますので関係あるかもしれないですね。慢性的な不眠症ですし、割と生きづらい性格です。
この不眠をマジでどうにかしたい...

とりあえずは安心したのですが、怖いのでさらに人生初の人間ドッグを受けに行く予定です。
病院大嫌いなので本当に憂鬱ですが、年齢も年齢だし避けて通れない道ですね...
胃カメラと採血まじ怖い。

とまぁ、そんなこんなでJavaをやっていますが、Laravelやりたくて仕方ない。
デプロイも結局やってないし、まだまだカスタマイズして行きたい。
でも複数言語を同時に勉強すると混乱するから勉強は1個に絞ると決めています。
前にswiftとRubyだったかな?PHPだったかな?を同時進行してたら訳分からなくなった記憶があります。

とりあえずJavaの基礎的な部分は終わったのでtodoアプリでも作ってみようかな。