ITと創作でねこを飼いたい

プログラミングやITで勉強したこと、疑問をまとめます。

これから毎週2000字は書く

これから毎週2000字は書く

注意)極めて自分のための決意表明(日記)の記事になります。

GW10日間のトライアル

2019年10日間あるGWでやってみたこと。
それは「毎日1000字は小説を書く」こと。

始まる前はもっとがっつり書くような気でいたが、
GW当初に決めたスモールステップを守った形になった。

少ない自覚はある。が、しかし学んだことも多い。

それは自分の文章を書くスピード感が分かったことだ。
具体的に1000字書くのに、おおよそ2時間かかっている。

まずは今の自分を受け入れる。
まあ、GW期間はなんやかんや続けられたというのは、ちょっとした自信になったのでよかった。
で、GW期に今の自分が継続的に執筆できるベストなスピードを考えた結果、
「週に2000字は書く」となったのである。

GWに創作できたのは、どっちかというと当たり前なので、
当たり前だが、これからの方が大切だろう。
「書くことを習慣づける」ことに注力していきたい。

筆が止まる原因

漠然と「こういう表現あったよな……」と思うのだがすぐに出てこない(かなりここはサボっている部分)
→(対策)本読んでいる時に印象的な文章表現は書き留めておく
書いていて展開が思っていた方向に進んでいかない。
→(対策)常々プロットは練っているが、もうちょっと細部まで考えられるようにする。
なんか突如疲れる。外に出れなくなる。
→(対策)そういう体質だと割り切る(HSP?かなって最近思えてきた)週一くらいは家で過ごした方がいい。

GW他にやったこと

友達とカラオケ1回
映画1回
AWSソリューションアーキテクトの勉強
部屋の掃除少々
MIDIキーボードのセッティング
ゲーム:ペルソナ5二週目
ブログ記事2つ
髪切った。
カフェには半分以上行った。

やる気を持続するために……

「もし僕がいま25歳なら、こんな50のやりたいことがある。」

「絶対に成功したいあなたへ]

絶対に成功したいあなたへ  圧倒的な成果を上げる ビジネスパーソンの心得50

絶対に成功したいあなたへ 圧倒的な成果を上げる ビジネスパーソンの心得50

社会人になって、上記のような自己啓発本も何冊か読んだ訳であるが、総じて書いてあることは、

成功するには、方向性を間違えずに、地道に一つ一つやっていく

ということであるように思う。
令和にもなったことですし、
一年目にやってきたITの勉強とも折り合いをつけながら、創作のペースも地道に増やしていこうと思う。
(残り一日のGWも小説書きます)

今回は珍しく創作関連の個人的な話でしたが、以上です。
小説投稿サイトのまとめ

AWSのCodePipelineでデプロイ対象のGitブランチを変更する。

AWSのCodePipelineでデプロイ対象のGitのブランチを変更してみます。(2019年4月末版)

ちょっと背景的な話

私がこの業界に入ったころには始まっていたサーバーレスの時代。
構築や管理が簡単になった分、インフラ担当者は一通りの構築が終われば「バイニャラ」しても不思議じゃない風潮になっているように思います。
(実際4月からインフラ担当がいなくなった!!)

今回は「バイニャラ」したインフラ担当者が用意してくださったデプロイ環境を、ちょこっとだけいじる必要性に迫られたので、ここにも備忘録残しときます。

前提

デプロイ環境はAWS CodePipelineであり、
すでに~pushしたらそのままデプロイ~という環境が整っている。

AWS CodePipelineとは

公式の説明によると、

ソフトウェアをリリースするために必要なステップのモデル化、視覚化、および自動化に使用できる継続的な配信サービス

です。

やりたいこと

THE 本仕様と暫定仕様の二重管理です。

master : デプロイ対象のブランチ : 本仕様
temp : 現状デプロイ対象じゃないブランチ : 暫定仕様

つまり、上のようなブランチだとして、
tempをmasterにマージせずにデプロイしたい
デプロイ対象のブランチをmasterからtempに切り替えたい
ということ。

やり方

私は、これを調べるためにAWS CodePipelineのチュートリアルやりましたが、実際はそこまでしなくても気づけたかなぁくらいの内容です。

(1)AWS CodePipelineのコンソール画面を開いて対象のパイプラインを選択。

(コンソール画面はゆくゆく変更されるかもしれませんが、気持ち載せときます)

f:id:ashanoguzyutu:20190427204135p:plain
どうでもいいですが、MyFirstPipelineはチュートリアルのPipelineのデフォルトネームです

(2)編集するボタンを選択。

f:id:ashanoguzyutu:20190427204601p:plain

(3)Sourceのステージを編集するを選択。

f:id:ashanoguzyutu:20190427205938p:plain

(4)画面が変化するので、編集を示すアイコンを選択。

f:id:ashanoguzyutu:20190427210247p:plain

(5)リポジトリ名の選択欄を変更したいブランチ名に変更します。

f:id:ashanoguzyutu:20190427210920p:plain

よくよくみるとリポジトリ名となっているのはややこしい感じがしますね・・・
アクションから見たらブランチの違いはリポジトリの違い、ということなのかもしれません。

保存ボタンを押しまくったら、ブランチの変更は完了です。

あとは変更したブランチの方でpushを行うか、変更をリリースボタンを選択すれば、違うブランチのソースをデプロイすることができます。

f:id:ashanoguzyutu:20190427211900p:plain

まとめ

この記事に書いてあるものは場当たり的な対応なので、ご注意ください。
(そもそも、私が言うまでもないですが二重管理はミスの元でしかないので、極力避けた方がいいでしょう)

ここまで書いていて、本格的に二重管理しなければならないならSorceにブランチが異なるアクション増やしたらいけるんじゃね?と思えてきました。
そっちは検証していないので、参考程度の情報として受け取ってください〜〜

HTMLタグの由来

以前の内定者時代に書いたブログを移行した内容です。
(前のブログを消したので供養)

もちろん、検索すればすぐ出てくるのですが、自分のメモも兼ねて、、

文章構造に関するタグ

<h></h>・・・heading(見出し)
<p></p>・・・paragraph(段落)
<pre></pre>・・・preformatted text(整形済みテキスト)
<br>・・・break(用途:改行)
<hr>・・・horizontal rule(水平方向の罫線)

画像

<img>・・・image(画像)
属性src→source(出典・引用元),alt→alternate(代替)
メモ:srcが他と略す方法が違い、個人的には調子が狂う。

リンク

<a></a>・・・anchor(いかり)
メモ:「なぜいかり?」とならなくもない。ある地点と連結するイメージからきているらしい。
属性href→「hypermedia reference」 or 「hypertext reference」
メモ:後半のreferenceは共通しているが、どうやら諸説ある模様。

一覧表示

<ol></ol>・・・ordered list(順序ありリスト)
<ul></ul>・・・unordered list(順序なしリスト)
<li></li>・・・list item(リスト項目)

<table></table>・・・略されていない。そのまま
<tr></tr>・・・table row(表の行)
<td></td>・・・table data(表のデータ)
<th></th>・・・table header(表の見出し)
メモ:thタグでなくtdタグでも書けないことはなさそう。ただブラウザによってはthタグだと文字が太字になる場合もあるとか。
属性colspan→column span(コラム<円柱、縦長の要素のイメージ>にわたって)=横方向の連結
rowspan→(行にわたって)=縦方向の連結

HTMLのタグ、属性は大量にある訳ですが、今回は初心者が最初に勉強するであろうタグについて簡単にまとめております。

FiddlerとEclipseのデベロッパーツールで挙動が違ったのでメモ

業務でちょっと引っかかったので軽くメモ。
(同じような事象の人の参考になれば)

事象:FiddlerでテストしていたときはException発生しならなかったのにEclipseデベロッパーツール使うとException発生する。

何がしたかったかって言うと、値を変えて業務チェックを通したかった。

原因

値がInteger型(Object型)だったのがみそだった。

結果を言うと
Eclipseデベロッパーツール使ったときにInteger型ではなく、int型で値を変更してしまっていてObjectを壊していたのが原因

myPCでは注意が出て事象を再現できなかったが、
EclipseにおけるInteger型(Object型)の正しい変更の仕方は以下

変数のタブに移動して f:id:ashanoguzyutu:20190227201415p:plain

変えたい値を選択して右クリック
「値の変更」を選択
f:id:ashanoguzyutu:20190227201507p:plain:w300:left

(注意書きもあるが)
new Integer('変えたい値')で変更完了
f:id:ashanoguzyutu:20190227201643p:plain:w500:left

結合テスト環境の時期にEclipseデベロッパーツール使ったら、サーバー落ちたので結構焦りました。(localなので、皆さんに迷惑をかけた訳ではありませんが)
結構盲点だったので、ここにメモ。

自作ポートフォリオサイトの改修(完全なる作り直し)

今日は簡単な報告ですが、自作ポートフォリオサイトの改修(新規作成)を行ったので、ご報告。(ていうかめちゃくちゃ みて欲しい)

サイトのURL

まずはサイトのURL!!

f:id:ashanoguzyutu:20190216170351p:plain
sendFunのトップページ
sendFun(it,story)

domainも手に入れました。
サイト名はJavaのメソッド名っぽく(キャメルケース)にして、 IT技術や創作を通して「楽しいものを届けていきたい」という思いが込められています。

モノ書くエンジニアとして、 スキルや小説のこと、趣味のことを載せています。

今までのポートフォリオの歴史

IT業界に入る前に作ったポートフォリオも、 供養として写真載せます。(このブログにも「唖者の愚述」というタイトルで紹介していました・・・)

f:id:ashanoguzyutu:20190216171110p:plain
唖者の愚述トップページ
f:id:ashanoguzyutu:20190216171234p:plain
唖者の愚述の自己紹介ページ
f:id:ashanoguzyutu:20190216171324p:plain
唖者の愚述作品紹介ページ

致命的だったのはframesetという過去の遺物を使っていたこと。
ITエンジニアとして勉強していくにつれ恥ずかしさが増す産物でした(笑)
一年目の終わりに、うまい具合に改修(新規作成)できてよかったです。

使用技術

CSSフレームワークの「Materialize」に完全にお世話になった形。

Bootstrap触ったことある人なら、すんなり使うことができると思います。(私は業務でBootstrap触っていたので、学習コスト殆どかかりませんでした)
今回使ってみて、「こんなデザインみたことある」みたいなの一杯あったので、おすすめです。
個人的には作成過程のなかで「Materialize」を好きになりました。

ただ、余白の微調整をするclass等は見当たらなかったので、Bootstrap から拝借したり、みたいなことはやっています(笑)
微調整も考えると全てを「Materialize」で賄うのは難しそうです。
というより、全てを賄う用のフレームワークではないのかなーって思います。

最後に

こちらのsendFun(it,story) のサイトのフッターに著作権マークつけてますが、
デベロッパーツールで見える分には(画像ダウンロードして別のサイトで使うとか以外)参考にしてもらっても特段問題はありません。
(参考にするといっても殆ど「Materialize」の書き方に準拠しているだけのソースですが・・・)

よかったら、見てやってください!!
今後もちょこちょこ改修していこうと思っています!!

Javaの16進数から10進数への変換についてのメモ

負の数(2の補数)を考慮した場合の16進数から10進数への変換について、 なかなか求めている情報が出てこない(なかった)のでここにメモ。

やりたかったこと

16進数で負の数(2の補数)を考慮した値を考えるには、 2進数表記で桁数を何桁に設定するのかってのが大事になります。 (大学や情報技術者試験の勉強でそう学んだ)

その桁数を可変にできるようにしたかった。

結果

そういうライブラリとかあるかなって思ったのだが、
うまく見つけることができませんでした。検索で引っかかるサイトは以下

苦肉の策として2つ目と3つ目のサイトの合わせ技をしました。 2つ目のサイトで

    int n1 = Integer.parseInt(arg, 16);
    int n2 = (byte)Integer.parseInt(arg, 16);

という部分に"FE"を代入すると、 n1は254,n2は-2となる理屈を考えます。
それは型の最大桁数に起因するものです。

つまりInteger.parseInt(arg, 16)をbyteにキャストすると、 8ビット(16進数で2桁)の2の補数で処理されるのです。

ということで、byte以外の型でキャストすれば、桁数を(自由自在ではありませんが)変更することができます。

    // 8ビットの2の補数/16進数で2桁の2の補数として処理したい場合
    int n1 = (byte)Long.parseLong("16進数文字列", 16);

 // 16ビットの2の補数/16進数で4桁の2の補数として処理したい場合
    int n2 = (short)Long.parseLong("16進数文字列", 16);

    // 32ビットの2の補数/16進数で8桁の2の補数として処理したい場合
    int n3 = (int)Long.parseLong("16進数文字列", 16);

一度大きな枠組みの型にしてからキャストする必要があるので、
3つ目のサイト内のように変換はLong.parseLong()を用います。 受け取る型は、キャストした型かそれよりも大きい型だったら大丈夫なはずです(厳密に確認できていない)
もちろん今回の方法ではJavaに用意されていない型(ビット数)では処理をすることができません。。。

終わりに

調べきれなかっただけで便利なライブラリはあるのかもしれません。
(知っているという方は、後学のために是非とも教えていただきたい)

Java Gold SE8でStreamAPIめっちゃ出てくるのでまとめてみる。

StreamAPI何問出てくるんだ(そして何問間違えるんだ・・・)
一回整理しようと思います。
試験対策>>>実装なのでご注意ください。
思っていたより長くなったのでざっくりとしたことが知りたい人は赤字周辺だけ読んでください。

基本

StreamAPIとはJava SE 8で新たに導入された「データ集合の操作用API」。
データ集合の個々のデータに対して様々な操作を順次行うことができる。

中間操作と終端操作

StreamAPIを使用したデータ操作では、
ストリーム処理の中間で適応される中間操作
最後に一度だけ適応される終端操作の二種類が存在する。
各操作のポイントは以下の通り

中間操作のポイント
・ストリームオブジェクトを返す。
・メソッド呼び出しの時点で処理が実行される訳ではなく、終端操作の実行時に実行される→遅延評価
・終端操作が適応されるまで何度も(0回以上)適応することができる。

終端操作のポイント ・処理の最後に一度だけ適応することができる。
・終端操作が適用されたストリームに対して再度ストリーム処理を適用することはできない。
→再度ストリーム処理を行おうとすると「実行時に例外がスローされる」

具体的な各メソッド

Stream<T>インタフェースのメソッドだが、問題集やってると「全部出てないか?」ってなる。(主要なものについてここに書きます!)
公式ドキュメント→Stream (Java Platform SE 8)
上記リンクのJava SE APIをぼんやり眺めるだけでも、個人的には勉強になるのではないかと思っています。
特にメソッドの引数と戻り値が分かっておくと試験問題が解きやすい
引数にはラムダ式(SAM)がよく登場するので、そこも注意です!!!!

中間操作のメソッド

Stream<T> filter(Predicate<? super T> predicate)
predicateの記述に一致にするストリームを返す。

<R> Stream<R> map(Function<? super T,? extends R> mapper)
mapperの戻り値をストリームとして返す。

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
イメージとしてはコレクションを含んだstreamを各値の一連のストリームにするメソッド。

Stream<T> distinct()
重複を除いたストリームを返す。

Stream<T> sorted()
自然順序に並べてストリームを返す。ただしストリームの要素がComparableでない場合、例外がスローされる可能性がある。

Stream<T> sorted(Comparator<? super T> comparator)
こっちはComparator型のインスタンスを直接引数に取っている。つまりcomparatorに従って並べ替えたストリームを返す。

Stream<T> peek(Consumer<? super T> action)
よくコンソール出力とかをやっているところ。

Stream<T> limit(long maxSize)
maxSize個までのストリームを返す。

Stream<T> skip(long n)
nだけ要素を飛ばしたストリームを返す。

終端操作のメソッド

void forEach(Consumer<? super T> action)
ストリームの各要素に対して処理を行う。

void forEachOrdered(Consumer<? super T> action)
定義された実行順に従い、ストリームの各要素に対して処理を行う。

long count()
ストリームの要素の個数を返す。

boolean anyMatch(Predicate<? super T> predicate)
ストリームの各要素のうち、一つでも条件を満たせばtrue

ちなみに

       boolean result = Stream.of(1,2,3,4).anyMatch(p -> p == 2);
        System.out.println(result);

を実行してみましたが「true」が一つだけ出力されました。
(ブログ書きながら、一瞬 false true false..とかfalse trueとか出てくるのかと思った)

boolean allMatch(Predicate<? super T> predicate)
全てが条件を満たせばtrue

boolean noneMatch(Predicate<? super T> predicate)
全てが条件を満たさないのであればtrue

Optional<T> findFirst()
ストリームの最初の要素を返す。Optionalについては後述

Optional<T> findAny()
順序は保証されていないが、最初に見つけたストリームの要素を返す。

Optional<T> min(Comparator<? super T> comparator)
comparatorに従って、ストリーム要素中の最小値を返す。

Optional<T> max(Comparator<? super T> comparator)
comparatorに従って、ストリーム要素中の最大値を返す。

試験対策の呪文1
Stream<T>インタフェースではmin、maxメソッドに必ず引数が必要

R collect(Supplier supplier,
BiConsumer<R,? super T> accumulator,
BiConsumer<R,R> combiner
)
ストリームに対して可変リダクション操作を行う(今回は深掘りしない)
BiConsumerは二つの引数をとって結果を返さないラムダ式の型

そして終端操作で必ずといっていいほど出るのがreduce
おそらくメソッド名は「減らす」というより「縮める」といった意味合いで名付けられているのだと思う。
reduceメソッドには基本的に、以下の二つの種類が存在する。
(実はもう一種類存在するのだが、reduceメソッドの具体的な使い方も含めて、以下のサイトを参考にして欲しい)

qiita.com

T reduce(T identity,
BinaryOperator<T> accumulator
)
(初期値)identityから引数を順番に二つとって引数と同じ型を返すaccumulator(BinaryOperator)の処理を行う

Optional<T> reduce(BinaryOperator<T> accumulator)
ストリームから引数を二つとって、引数と同じ型の結果を返す。

試験的に大事なのは戻り値の型が違うこと

Optional<T>はAPIドキュメントをみる限り、「もしかしたらnullかもしれないけど、nullも含めて値として入れておくね」っていう型っぽい。中身の値を取り出すにはJava Gold SE8の試験では2/3くらいはget()メソッドが用いられている。(慎重に処理するならOptional<T>の別のメソッドの方が良さそう)

要約すると、、、
試験対策の呪文2
引数を一つしか取らないreduceメソッドでは結果の値を取り出すためにgetメソッドが必要

もちろん他のOptional<T>を返すメソッド(minとかmaxとか)にもgetは必要!!!!

Streamインタフェースの種類

f:id:ashanoguzyutu:20180717004002j:plain

基本はStream<T>インタフェースなのだが、他のもちょくちょく出てくるので厄介。
上の図を見てもらったら分かるが、StreamAPIはどれもBeseStreamを継承している。

StreamとIntStreamの違いは?

Stream<T>インタフェースは参照型(T型)のデータ集合を扱うためのインタフェース
IntStreamインタフェースはInt型(プリミティブ型)データ集合を扱うためのインタフェース。

ここだけ読むと「ああ、そう」ってかんじ。

ただJava APIドキュメントを見比べると分かるが、
Stream<T>インタフェースとIntStreamインタフェースでは、メソッドの内容が似ている割にintStreamインタフェースの方がメソッドの数が多い

数え間違えがなければ、Stream<T>インタフェースは39個に対しintStreamインタフェースは44個のメソッドが存在する。

増えたメソッドの例

int sum()
IntStreamの要素の合計を返す。終端操作。

OptionalDouble average()
IntStreamの要素の平均を返す。終端操作。

つまり、中身がint型だと分かっている分、int型に特化したメソッドが追加されたということ
数値だと分かっていなければsumなんてメソッドは用意できない訳だ。
Int型(プリミティブ型)データ集合を扱うためのインタフェースとはそういった意味を指す。

Stream<T>インタフェースにも存在するが、かなり変化のあったメソッド

OptionalInt min()
このストリームの最小要素を記述するOptionalint(または空のOptional)を返す。

OptionalInt max()
このストリームの最大要素を記述するOptionalint(または空のOptional)を返す。

ここで呪文1の効力が出てくるのだが
試験対策の呪文3
InStreamインタフェースのmin,maxには引数はない

さらにOptionalIntにもgetは必要か?という話になる訳だが、ここではgetではなくgetAsIntメソッドが必要。。 ややこしい。。

あとIntStreamインタフェースで押さえておきたいのは、、
試験対策の呪文4
InStreamインタフェースのメソッドにラムダ式(SAM)の型が入る場合、ほぼIntから始める

何を言っているんだ、、となっているかもしれないが、
つまりStream<T>インタフェースで引数の型がFunction型となっていたところはIntFunction型になっている、という意味。

Stream<T>インタフェースの場合
filter(Predicate<? super T> predicate)

IntStreamインタフェースの場合
filter(IntPredicate predicate)

てな具合。
collectとかだと少し話は違ってくるようだが、概ねこのルールに従っている。
Functionインタフェースをよく理解している人なら、処理しているのがint型なんだか当たり前やんってなるのかもしれない。

Stream<T>からIntStreamへの変換

中間操作のメソッド(飛ばしてた)のmapToIntを用いる方法がJava SE8 Goldでは一般的
定義↓
IntStream mapToInt(ToIntFunction<? super T> mapper)

同じように他のStreamインターフェースに対してmapToLong,mapToDoubleといったメソッドが存在する。逆にIntStreamからStream<T>に変換する場合はmapToObjectboxed()と言ったメソッドが用いられる。

どのStreamインタフェースも自分に変換する以外のメソッド(IntStreamならmapToInt)は定義されているようだ。

総集編

「「Inteager型の数値の入ったストリームオブジェクトで、引数を取らないmaxメソッドを用いて最大値を出力する」」

プログラムは以下のようになり、コンソールには4が出力される。

       int num = Stream.of(1,2,3,4)           //Stream<T>のストリームオブジェクト
                  .mapToInt(l -> l)        //IntStreamのストリームオブジェクトに変換
                  .max().getAsInt();      //IntStreamインタフェースのmaxメソッドの利用
        System.out.println(num);

まだまだ細かいことを言い出したらきりがないですが以上です。
StreamAPIの問題を解くときの迷いが少しでも減ったらいいなぁ、と思っております。