読者です 読者をやめる 読者になる 読者になる

StaticDiary

AI、iOS、Android開発関連の備忘録です

就活をしていて思うこと(日記)

現在就活中です

 現在大学三年生のため、絶賛就活中です。今日も某大手企業に行き、明日は3社選考とインターンに行ってきます。

 正直ハードスケジュール&自分の勉強の時間が取れていない…

 

 俺基本的に言い訳するやつ嫌いだし、自分で言ったこと達成できないやつもあんまり好きじゃないけど、自分がそうなっているのが情けない…

 

 プログラム書きたいんだけどねー、英語やったり仕事やったりで自分の+αができていないなぁ

 

 まあ、二月いっぱいでだいぶ落ち着くはずだからもう少しの辛抱だけどほんのちょっぴりずつコード書いていきます

 

 寝ない選択肢もまだあるけど、やっぱり採用選考だからしっかり睡眠はとったうえで全力を尽くしたいよね

 

 

Kotlinを触ってみた

Kotlinを触ってみた

 仕事でAndroid開発をやっていてKotlinを触る機会ができたのでとりあえず触ってみっかという勢いでいろいろと調べてみた感想をメモに残しておく

Kotlinってなに?

 

f:id:SHiZURU:20170205222832p:plain

  jetbrainsが開発しているプログラミング言語Javaと互換性がある。Javaの代替言語として登場し、静的型付け、オブジェクト指向ラムダ式高階関数、拡張関数やNull安全といった特徴を持つ。

 Swiftにすごく似ているのでiOSエンジニアだととっかかりやすい気がする。

 一通りいじってみたけど、とにかく見やすいわかりやすい。また、Javaと互換性があるのがまたいい。AndroidStudioでも当然プラグインを導入することで使える。

 

個人的に感動したとこ

 まだ、完璧に覚えているわけではないけど、この土日調べていていいと思ったのはまずwhen式がすごいと思う。

 Javaのswitch文みたいなものだけど、break書いたりしなくていいし何より分岐条件に定数以外を指定することができる。

 いろんな条件で指定可能。

when(x) {

     in 1..5 -> "1 <= x <=10"

     myAge() -> "age: $x"

     else -> x.toString()

}

 上のように書ける。ただ、elseは必ず書く必要がある。

日本語の書籍もある

 Kotlinを学ぶのに日本語の書籍もあり、自分も読んでみた。

 

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

 

  非常に丁寧に文法紹介されているので、JavaAndroid開発をしている人にはとてもいいきっかけになるのではなかろうか。当然公式のドキュメントが詳しいけれど、敷居は下がるのでこの本を読むことはいいとおもう。

 これからの開発においてKotlinが主流になっていくような気がする。なぜなら、Javaに比べて圧倒的に見やすいからだ。コードが見やすいことで開発にかかる学習コストも減るし、簡潔に書いているからパッと見てわかりやすい。これからAndroidをやっていくのであれば進んで勉強する価値のある言語の一つであると個人的には思う。

 といいながらも、自分はまだまだ初心者なのでもっと勉強してからまた投稿しようと思う。

UnicodeEncodeErrorに振り回されたのでメモ

UnicodeEncodeErrorで悩まされた

pythonスクレイピングクローラーの技術を習得しようと最近奮闘中であるのだが、今日はUnicodeEncodeErrorに悩まされた話

 

今は次の書籍を読みながらpythonスクレイパーを作っている最中

 

 

この本は理解しやすくてコードも載っているのだがところどころ修正が必要な箇所がある

 

今回ぶち当たったのがUnicodeEncodeErrorの話

HTTPヘッダーからエンコーディングを取得して、レスポンスボディをデコードしたものを標準出力してファイルに保存する際にまず一回目のUnicodeErrorがでた

 

UnicodeEncodeError: 'cp932' codec can't encode character '©' in position 9261: illegal multibyte sequence

 unicodeにしないとだめだというエラーのよう。ググったら型が違うために出てるらしい。

そういうわけでコードに以下の行を使ってうまくいった

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 

 標準出力をutf-8にエンコできる優れもの

 

まあ、これで出力後にファイルとして保存することができたわけだが、次にこのエンコしたファイルを使って正規表現スクレイピングしてほしいデータを取り出そうとしたときにまたUnicodeEncodeErrorが発生した

 

これはファイルを開く際に型がUnicodeになってないためだったみたい

 

なのでググって開くときに下のようにutf-8エンコードしてみるようにコードを書き換えたところうまくデータを取得できた

with io.open('dp.html', 'r', encoding='utf-8') as f:

 

UnicodeEncodeErrorはやっかいなものでまたどこかで引っかかるかもしれないから残しておく

 

参照:

UnicodeEncodeError: に悩まされない。Python2.x から Python3.x への乗り換え

 

#1 TensorFlowの公式を翻訳する| 基本的な使い方(1)

基本的な使い方

TensorFlowを使うためにあなたは以下のことを理解する必要がある。

  • グラフで計算を表現する
  • Sessionsの中身でグラフを実行する
  • tensors(テンソル)としてデータを示す
  • Variablesで状態維持する
  • 任意の操作間で入出力のデータを得てフィードとフェッチを行う

 

概論

TensorFlowはグラフで計算を表現できるプログラミングシステムである。グラフの節(ノード)はops(operationsを略したもの)と呼ばれる。opはゼロかそれ以上のTensorsを取り、いくらかの計算を行い、ゼロ以上のTensorsを生成する。TensorFlowの用法において、Tensorとは多元配列型である。例えば、あなたは浮動小数点型の次元を持つ[batch, height, width, channels]の4次元の配列としてのミニバッチの画像を表すことができる。

TensorFlowグラフは計算の描画である。何かを計算するということは、グラフはSessionのなかで立ち上げられなければならない。SessionはDevicesの上にopsグラフを置く、CPUもしくはGPUといったDevicesであり、それらを実行するメソッドを提供するのだ。これらのメソッドはPythonではnumpyのndarrayオブジェクトとして、また、CやC++ではtensorflow::Tensorインスタンスとしてopsによって生成されたtensorsを返す。

 

計算グラフ

TensorFlowプログラムは通常グラフを集める構成段階から始まり、グラフ上でopsを実行するためにsessionを使う実行段階を経て構成される。

 

TensorFlowはC,C++Pythonで使うことができる。最近では、より簡単にグラフを集めるためのPythonライブラリを使い、またCやC++では利用可能でないラージセットの補助関数を提供している。

 

sessionライブラリは3つの言語において関数を備えている。

 

グラフのビルド

グラフをビルドするために、opsの定義から始めよう。constantのようなどんな入力も必要とせず、計算するために別のopsに出力を通す。

 

Pythonライブラリにおけるopコンストラクタはopsで構成された出力を表すオブジェクトを返す。これでほかのopコンストラクタからの入力を通すことができる。

 

TensorFlowのPythonライブラリはopコンストラクタがノードを加えるデフォルトのグラフを持っている。

デフォルトのグラフとは、多くのアプリケーションで動作する。

 明確に多数のグラフを維持するやり方については Graph classドキュメントを見てください。

 

import tensorflow as tf

# Create a constant op that produces a 1x2 matrix.  The op is
# added as a node to the default graph.
#
# The value returned by the constructor represents the output
# of the constant op.
matrix1
= tf.constant([[3., 3.]])

# Create another constant that produces a 2x1 matrix.
matrix2
= tf.constant([[2.],[2.]])

# Create a matmul op that takes 'matrix1' and 'matrix2' as inputs.
# The returned value, 'product', represents the result of the matrix
# multiplication.
product
= tf.matmul(matrix1, matrix2)

 今、デフォルトのグラフは三つのノードを持つ。二つはconstant opsで一つはmatmul opsである。実際に行列を増やして掛け算の結果を得るためには、Sessionでグラフを立ち上げなければならない。

Sessionにおけるグラフローンチ

グラフを作った後は、Sessionオブジェクトを作ることで立ち上げることができます。異なるグラフがコンストラクタで指定されない限り、Sessionはデフォルトのグラフを立ち上げる。完璧なAPIについては Session class を見てください。

# Launch the default graph.
sess
= tf.Session()

# To run the matmul op we call the session 'run()' method, passing 'product'
# which represents the output of the matmul op.  This indicates to the call
# that we want to get the output of the matmul op back.
#
# All inputs needed by the op are run automatically by the session.  They
# typically are run in parallel.
#
# The call 'run(product)' thus causes the execution of three ops in the
# graph: the two constants and matmul.
#
# The output of the matmul is returned in 'result' as a numpy `ndarray` object.
result
= sess.run(product)
print(result)
# ==> [[ 12.]]

# Close the Session when we're done.
sess
.close()

 Sessionsはリリースされているリソースで閉じられるべきである。より簡単にリソースを維持するためには、with構文を使う。どのSessionもblockが存在するときclose()を呼ぶcontext manegerを実装する。

with tf.Session() as sess:
  result
= sess.run([product])
 
print(result)

 TensorFlowの実装はグラフの定義を利用できる計算資源(CPUやGPUといったような)全体で分配された実行操作へと翻訳する。一般に明確にはCPUかGPUを指定する必要はない。より多くの活動のためにできる限りもしあなたが持っているならば、TensorFlowは第一にGPUを使用します。

 

もしあなたが一つ以上のGPUをマシンに搭載しているなら、それらを使うために初めに明確にopsを割り当てなければならない。with...Device構文を用いて活動のために使用するCPUかGPUを指定する。

with tf.Session() as sess:
 
with tf.device("/gpu:1"):
    matrix1
= tf.constant([[3., 3.]])
    matrix2
= tf.constant([[2.],[2.]])
    product
= tf.matmul(matrix1, matrix2)
   
...

 

Devicesは文字列で指定される。正しくサポートされるdevicesは以下のとおりである。

  • "/cpu:0": マシン上のCPU
  • "/gpu:0": マシン上のGPU
  • "/gpu:1": 二番目のGPU,番号ごとに増える

GPUとTensorFlowについてもっと多くの情報を知りたければ次のリンクを見てください Using GPUs

【第一回】Microsoft Azure Machine Learning Studioを触ってみた

今日はMicrosoft Azureを少し触ってその感触と感想を述べていこうと思います。

Microsoft Azureってそもそも何?

 公式サイトは以下のように書かれている。

Microsoft Azure は、分析、コンピューティング、データベース、モバイル、ネットワーク、ストレージ、Web などを統合した、
現在急成長を遂げているクラウド サービスのコレクションです。

 

ほほう…………(・_・D フムフム……

 

 

 

……わからん。

 

 

 

 

いろいろとググってみた結果データベース、モバイル、ネットワークなどなど複数のコンポーネントを寄せ集めた開発環境をクラウド化したということかな?という理解でいる。

つまり、自由度が高くなるし負荷が分散されるしで好きなカスタマイズができるようになるっていう感じかな~と思っていたり。

 

自分はとりあえず機械学習を勉強してきたので、とりま最近よく目にするAzure触ってみっかという気持ちで取り組んでみた。

 

さっそく使ってみる

まずはトップサイトにアクセス

f:id:SHiZURU:20170117233222p:plain

今すぐご利用くださいをクリックする

次にコースを選ぶ

f:id:SHiZURU:20170117233307p:plain

一番左はともかくお試しで触ってみてどーよ!っていうのを知りたい人向け、真ん中はMicrosoftのアカウント持ってればフリーで使えるよ!RとPythonはサポートしてっぜ!!みたいな

一番右は製品として提供してて本格的にやってサービス提供したい人向けって感じだと思う

 

今回はほんとにさわりだけをやりたかったので迷わず一番左を選択

 

チュートリアルをやってみた

お笑い芸人のほうじゃないですよ

 

f:id:SHiZURU:20170117233557p:plain

Azureさんに言われるがままにチュートリアルをやって視覚化できることまでは分かった。

 

 

しかし、何やっているかわからん!

 

Tensorflowは分かりやすかったのに…

 

見る人が見ればわかるのだろうけど、自分はまだまだ分かってないからどういうことかさっぱりという状態。

 

日本語のチュートリアルと説明があればいいなぁ(甘え)

 

おそらく、これは使い方としてはGUIレベルで機械学習の動作を知りたい人でかつプロジェクトを作成して自分の書いたソースコードを視覚化できるということだろう。

 

しかし英語が多すぎて理解が大変。。

(英語力の無さを痛感。地道にやらなくては。。。)

 

 

これの使い方が載っている書籍がAmazonで売っていたので今度はそれを見ながらもう一度真ん中のコースでトライしてみようと思う。

1日1プッシュのすゝめ

Write code everyday!が今年の目標です

 仕事とプライベートで毎日コードを書いていこうと決めてはや1週間が経ちました。

 

せっかく決めた目標なのに1/1 ~ 1/11までで1日も欠かさずにやってきました!

 

と、言いたかったのですが会社の新年会の日である1/6だけプッシュできなかった…

 

喝!ですね。。。

 

とりあえず7日からということにして、ここ数日で起きた変化を書き留めます。

 

毎日コードを書くと決めてからよかったことが3つあります。

 

一日コードについて考えるようになった

毎日1プッシュしなければならないというある種の強迫観念を自分に設けることで、今日は何を書こうか、どんなものをつくって自分の技術を伸ばそうかと暇さえあれば考えるようになりました。

 

それまでは、会社であったり電車の中であったり毎日21時くらいから始めるかというように決まった場所や決まった時間で切り替えて考えるようにしていたのですが、やはり暇さえあれば考えておくというスタイルを作れるのがいいと思います。

 

もちろんコードのことだけを考えているわけではありませんが、一日にメリハリをつけて行動するようになったかなと思います。

 

技術書を読む時間が増えた

何を作ろうかと考えているときにまずは題材がないと始まりません。

自分で技術書を購入しそれをコードで書いていくことだけでも一日ある程度の勉強時間を確保できるためにこれを続けていけば確実に成長できるだろうなと実感として湧いてきました。

 

技術書も自分で書店で買うのではなくAmazon経由で購入するようになったために時間を自分のためだけに有意義に使えるしポイントもつくし技術力も少しずつ上げていける予感に満ちていて毎日が楽しくなってきています。

 

今までの復習の機会が増えた

なんとなく大学の勉強を受けていてこれってつかえるのかなと疑問に思いながら受けていたものが今になって少しずつつながるものが出てきた。一生関係ないものをやっているんじゃねーかなーと1年のころは思っていたが、思っていたよりも少しだけマシだったらしい。ほんのすこしだけ…結局自分で勉強したんだけど

 

また、ここ数か月で会社で実践してきた内容の復習にもなり自分の技術力は3か月前に比べたら全然上がったなと振り返って思う。

反復しない限りは絶対身につかないので場数を踏み、自身で知識を確かめるのにいい機会を作れている。

まとめ

まずは、やってみること。すぐに行動に移すこと。

ともかく些細なことをコツコツと繰り返していくことが大切

新卒エンジニアとして読むべき本「リーダブルコード」

みなさん、こんばんは。しずるです。

最近見たい映画はファンタスティックビーストです。時間できたら早く見に行きたいところです。

 

さて今回は、今週自分が読んでいた本でこれはエンジニアなら読んだほうがいいんじゃないかなと思って共有したいので紹介させていただきます。

 

リーダブルコードとは?

 オライリー・ジャパンから発売されている技術書でコードを書いていく上での実践的なアドバイスが書かれている。

 

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

 

 

 

開発者として生きていくうえで一人で開発するのではなくやはりチームを組んで働いていくために他の人が読んだときにすぐに理解できる読みやすいコードを心がけて書いていく必要がある。

 

では、読みやすいコードとは何なのか?と新卒エンジニアなら思うかもしれない。

 

ちなみに、ここでいう新卒エンジニアとは自分のように一人で何か簡単なゲームでも作ったけどサービスとして世の中に提供できるものかと言われたら微妙という人や、大学ではある程度勉強したけど実際の開発はよくわからないという人、一人でコードは書いてきたけどチームを組んで開発した経験がないという人に向けて書いている。

 

コードを書いていくうえで心がけておくべきことが要約されている。

 

実際に働いてみてから読んだ感想

私は今とある企業にてインターン中であり、内容はiOS & Androidアプリ開発&運営のメンバーとして働いています。

 

働いているとはいってもリーダーではないし、個人でオリジナルの簡単なゲームくらいなら作ったことがあるけどプログラミング自体を大学から始めたので実質そこらの新卒とあんまり変わらないかな~というような感じです。

 

今はGitHubでチーム開発をしていてプロのエンジニアの方に指導をいただきながら働いております。

 

このリーダブルコードを読んで、まず初めに飛び込んでくるのが

 

面白いと、読みやすいは、違うんだよ?

 

という文言です。

 

開発をしていくうえで大切なことは、とにかく読みやすいコードを書くということ。

 

開発はひとりでもできるんだよ!俺はやれるから関係ないよ!という人もいらっしゃるかもしれません。優秀な方だとそうなのかもしれません。

 

しかし、半年たった時に自分が読んだときにパッと見て何をどのような目的でやっているのかがすぐに理解できないというようなコードであれば当然相手に伝わるはずなんかありませんよね。

 

 

 

僕は会社に入ってから3か月くらいで、ちょくちょくコードに関連して指摘を受けることがあります。

 

インデントがずれているとか、書き方に統一感がないとか、そういった基本的なことからこのクラスは何をやっているのか?とかこの変数はどういう意図なのか?とか入っているコメントが長いとかそういったことです。

 

基本的な部分は大学の授業で指摘されていたりしてまだ自分自身で直しきれていない部分が多いためすぐに納得して修正していきました。

 

しかし、動けばいいしコメントが長いほうが詳細でわかりやすいと思って僕は書いていたので初めはあんまりよくわかっていない感じでした。

 

もちろん現場のエンジニアの方が丁寧に説明していただいたので意味はわかってすぐに修正したものの実感はすぐには湧いてこなかったです。

 

なぜか、というと大学の授業ではコメントを長く書くことまずは動かせるようになることひとつの変数の名前もとりあえずどういう意図なのかわかる単語に書き落としておけば周りが勝手に読んで納得してくれるから特に気にしていなかったです。

 

しかし、この本を読んでみて思うことはやはり読みやすいコードを書くというのは誰が見ても簡単に理解でき他の人にいちいち説明しなくても伝わるように書くのが当たり前のことなんだなと今までの経験を通じて納得できました。

 

この本に書かれていることは、エンジニアとして生きていくのであれば当然のことが書かれてあるし、僕も実際に読んでみていろいろ指導していただいたことを振り返って全部エンジニアの方が仰っていたことと変わらなかったと思います。

 

それはつまり、エンジニアとしての常識、当たり前のことなのだと

適切な時に適切なコメントを入れる

変数やクラス名は短いコメントである

変数やクラス名にわかりやすい適切な名前を付ける

ネストを浅くする

一時的な変数は極力書かない etc...

上は引用というよりかは、簡単に自分の心に響いた部分を部分的にピックアップしてきたものです。

今指導していただいているエンジニアの方にいわれてハッと思った部分でもあります。

 

我流でやっていると変な癖がついてしまっていたり、自分がわかればそれでいいかなとおもっていてやっていたのでやはりきれいなコードではないんですよね。

 

本当に今の会社に入る前にこれを読んでおけばよかったなと思っています。

 

僕は大学3年生でこれから本格的に就活の時期になるのですが、新卒でエンジニアとして働いていこうと思っている人は暇な時間を見つけてぜひ見ておくべきだと思います。