natumn_tech_BLOG

little by little

2017年の振り返り && 2018年のやっていきたいこと

2017年が終わる...

というわけで、今年をあったことをざっくり振り返りつつ、来年やっていきたいことを書いていこうと思う。 つまり、これはただの自己啓発でポエムです。

2017年を振り返って

去年とは違い今年は会津から出て、東京のイベントやインターンに参加して割と刺激的な一年にできたと思っている。 1月からみていきます!

1月~ 6月

最初のイベントは成人式(仙台)があった。久々に地元の友人にあったりしてとても盛り上がった。 酔っ払ってあんまり覚えてないが、楽しかったって感覚はある。うん。。 記憶が曖昧になるまで飲んじゃダメだと学んだ。。

2月に一人でデブサミ2017に行ってきた。

event.shoeisha.jp

そこでは、実際に東京で働いているエンジニアの人たちの話を聞いて、技術的なことはもちろんだが、それ以外にも企業ごとの考え方とか方針とかも聞けて参考になった。

7月 ~ 9月

7月はtenntennさんが会津に来てくれて、aizu.goを開催できた。

メルカリ tenntenn氏によるGo言語講座 in 会津

会津でGoが広まったらいいと思った。継続的にaizu.goを開催できたらと思う。

8月、9月ではインターンに行った。 1社目がwantedlyに一週間いき、2社目にさくらインターネットに3日間行った。

wantedlyでは就業型のインターンwantedly peopleのサーバーサイドに入り、Goを書いてた。

people.wantedly.com

自分としては一週間全力でコミットできたし、メンターの山田さんにたくさんのアドバイスやフィードバックをもらえたし、最高だった。 しかし、外的な要因があったとはいえ自分のプルリクがマージされなかったのは悔しかった... そんな感じで自分の実力もしれたし、たくさん学べたし、とてもいい経験になったので良かった。 次はマージされて、ミーティングでプレゼンできるように結果を出したい。

さくらインターネットでは3日間をとおしての業務の体験型のインターンだった。

www.googleadservices.com

一日目でオンプレのサーバーをセットアップを行い、二日目にフロントエンド部分の話とVPSなどの仮想環境の仕組みを学び、三日目にサーバー監視の設定と社員さんにセットアップしたサーバーを攻撃してもらい、動きを監視するという流れだった。濃い3日間を過ごした。社員さんみんないい人で最高だった。。 自分が普段意識しないインフラの部分に触れてとても新鮮で楽しかった。

九月の頭あたりだったか、友人と富士急ハイランドに行った。富士急クラスのジェットコースターだと気持ち悪くなってしまうので、だめ。 めっちゃ楽しかった!

ちなみにその期間、アルバイトではVue.jsでフロントエンドをずっと書いていた。

10月 ~ 12月

10月ではISUCON7予選に出た。 今回は id:ktr_0731 と2人で出た。残念ながら、予選敗退で自分はチームのポイントになかなか貢献できなかったが、nginxのチューニングなどをやった、学んだ。 次はとりあえず予選突破したい。

11,12月は、LTイベントラッシュだった。

まず11月はじめの3連休でvim-conf2017、GoConに行ってきた。

本当に優秀な人たちばかりで正直、身がすくんでしまった... でも、レベルの高いエンジニアと話せてとても刺激的だった。 また、そこで新しいつながりもできて、充実した3日間にできた。

まだまだあるしどれもとてもいい経験になったが、多くてすべて書ききれないのでリンクだけ。

atnd.org

「IoT・AI・機械学習の現状と未来展望、そして、これからのエンジニア像」さくらインターネット 取締役 伊勢 幸一氏

会津大学 × ウェブベンチャー! エンジニア LTバトル in 会津大学

会津大×企業!Go言語+仮想通貨 L Tイベント

オープンカフェ会津「プロダクト作り」

この期間はイベント多くて本当に疲れた。。。 けど、いろんな話が聞けて、いろんな人と話せて楽しかった。

全体

全体的に振り返ると、1月 ~ 6月がなんか薄い。とくになにもしてなかったし、あの時間をもう少し活用できたな... 7月あたりからはそれなりに忙しくいろんなことをやれたので、まあいいかなと思う。というのも会津から出て、また会津に人が来て、いろんなことに触れられて刺激されたのが大きかったかなと思う。 あと、IT系以外のイベントでなにやったか思い出せない... ていうか、あんまない... まずい... 来年はIT以外にもしっかりやっていきたい。 

2018年のやっていきたいこと

2017を踏まえ、2018年に達成したいことをまとめてみる。

1. インターン

2017年では何社かインターンに行って、技術的な学びがあったのでそこは良かったが、行った先の会社で貢献できたかというとあまりできていなかったように思える。 なので、今年意識していきたいのは自分の武器となる技術を持ちつつ、何かしら結果を出し続けていきたいということだ。 またそこで、自分がどんな場面に貢献していくエンジニアでありたいか見定めていきたい。

2. OSS活動

アルバイト先やLTでのアウトプットはできていたと思うが、GitHubなどのOSSでのアウトプットがあまりなかった。なので、今年はOSS活動をもっと積極的にしていこうと思う。とりあえず、今はどんなものでもいいから毎日コントリビューションしてアウトプットを続けることを意識していきたい。そのあとに、付加価値がつくようなものを開発できたらと思う。特にRustとかRustとか書いていきたい。

3. ISUCON予選突破

今年のISUCONは予選敗退でとても悔しかったので、2018年は予選突破したい。

4. フル単

地味に落胆しまくってて意外と単位がギリギリになってしまっているので、しっかり授業と課題やってちゃんと取らないと...

5. 旅行

どこか遠くにいきたい。

6. ブログなどアウトプット

ブログとか読んだ本とか細く記録してくことをやっていく。

おわりに

まとめると、2018年は結果、数字にこだわる一年にしていきたい。 そして上記の目標の6つ全て達成させられるように頑張りたい。

では、良いお年を!

Rustでheadコマンドを作ってみる

はじめに

この記事はAizu Advent Calendar 2017の19日目の記事です。

adventar.org

2月以降ブログは全く書いてなくて、約10ヶ月ぶりです。natumnです。
最近はアルバイトでフロントエンドをかき、個人的にバックエンドやシステムプログラムをかくみたいな生活を送っています。


そこで今ちょうど、「ふつうのLinuxプログラミング(第二版)」という本を読んでるのですが、本の中に「headコマンドを作る」という章がありました。
そのままC言語で写経してもあまり面白くないので、自分が今勉強中であるRustでheadコマンドを実装していきたいと思います。

環境

cargoバージョン 0.19.0
Rustバージョン 1.18.0

目標

今回は以下のような仕様を満たすコマンドを作っていきたいと思います。

  • 第一引数はrhead
  • nオプションとその後ろの数字で行数指定
  • ファイル名指定

例)

$ rhead -n 5 cat.txt

プログラムは

github.com

にあります。

それでは、作っていきましょう!

コマンドラインの解析を行う

まずコマンドラインの解析だけを行います。
ツールは公式から提供されているgetoptsというcrateを利用します。

doc.rust-lang.org

まずは rhead、-nオプションとそれに続く行数、-rファイル名の3つを取得します。
以下のように書きます。

    // argsを取得
    let args: Vec<String> = env::args().collect();
    let program = args[0].clone();
    let filename = Some(args[4].clone());

    // optionの設定
    let mut opts = Options::new();
    opts.optopt("n", "", "set number of lines", "LINES");
    opts.optflag("h", "help", "print this help menu");

    // optionの解析
    let matches = match opts.parse(&args[1..]) {
        Ok(m) => m,
        Err(f) => panic!(f.to_string()),
    };
    if matches.opt_present("h") {
        print_usage(&program, &opts);
    }
    let opt = matches.opt_str("n");
    let cmd = if !matches.free.is_empty() {
        matches.free[0].clone()
    } else {
        print_usage(&program, &opts);
        return;
    };

    // cmd, opt, filenameをprintする関数
    do_work(&cmd, opt, filename);

fn do_work(inp: &str, lines: Option<String>, filename: Option<String>) {
    println!("{}", inp);
    match lines {
        Some(x) => println!("{}", x),
        None => println!("No lines"),
    }
    match filename {
        Some(x) => println!("{}", x),
        None => println!("No File"),
    }
}

fn print_usage(program: &str, opts: &Options) {
    let brief = format!("Usage: {} FILE [options]", program);
    print!("{}", opts.usage(&brief));
    process::exit(0);
}

コードの流れとしては

まず、はじめにコマンドライン引数に渡される値を取得します。
その後、getopsを利用してoptionの設定を行っています。(例えば、-nがきたらその後ろの値をLINESとして取得しています)
そして、それぞれの引数の解析をおこない、その結果をdo_work関数に渡します。
do_work関数では情報であるコマンド名、行数、ファイル名が出力されます。


出力例)

f:id:nktafuse:20171219135659p:plain


head関数を作る

次にhead関数を作っていきます。
head関数は取得した行数とファイル名を元にファイル内容を出力します。

コードは以下のようになります。

fn head(lines: i32, filename: String) -> i32 {
    // ファイル読み込み
    let string = String::from(filename);
    let path = Path::new(&string);
    let mut file = BufReader::new(File::open(&path).unwrap());

    // ファイルが空かチェック
    if lines <= 0 {
        return 0;
    } else {
        let mut buf = String::new();
        let mut count = 0;
        let mut done = false;

        // 選択した行数かファイルの最後まで行ごとに出力
        while !done {
            file.read_line(&mut buf).expect(
                "reading from BufReader won't fail",
            );
            print!("{}", buf);
            count += 1;
            if lines == count || buf == "" {
                done = true;
            }
            buf.clear();
        }
        return 0;
    }
}

このコードではまず、ファイル名からファイルのバイト列を取得して、それを一行ごとに print! してます。
バイト列の取得にはBufReaderトレイトを利用します。


そして、カウントが指定の行数に達するかファイルが最終行までいったらループを抜けるようになっています。
今回の場合、file.read_line()はBufReadトレイトを満たしたトレイトでかつ、引数ではバイトのスライスでなければ利用できませんので、注意が必要です。
自分はここへんの知識が曖昧で結構時間を溶かしました。

そして、最後にmain関数のもとあったdo_work関数をhead関数に合うように変更してcargoで実行すると、以下のような実行結果が得られます。


出力例)

f:id:nktafuse:20171219180403p:plain



なんとか仕様をみたすプログラムができました!

まとめ

  • getoptsでオプション解析できる。
  • トレイトや型の条件を満たす実装をしているかの把握は重要。

おわりに

Aizu Advent Calendarの投稿に間に合ってよかった...
簡単でヘルプなどの機能を追加していないのですが以上になります。
比較的簡単なプログラムなのに意外と時間かかった... traitや所有権とかまだ慣れない。

私自身Rustを最近学び始めたので、なかなかRustの機能を生かした書き方ができていないかもしれません。
上記のコード中にある、行数分の出力する処理の部分など所々いい書き方が思い浮かびませんでした...
これから書いていって、知見を増やしていきたい。


もし、「ここをこう書いたら良くなる」などアドバイスありましたら、お願いします...!


では、これで!読んでくれた方、ありがとうございました!

Developers Summit 2017 1日目に行ってきた。

こんにちは。2ヶ月ぶりくらいの投稿です。
先日2/16に、東京の目黒で開催されたDevelopersSummit2017に行ってきたのでそのことを書く。

f:id:nktafuse:20170220162950j:plain

会場は目黒雅叙園

Developers Summit 2017とは

総合ITコンファレンスです。
様々な会社の方が最新のソフトウェア開発やシステム開発、インフラ管理、自社制度などのIT系技術、制度のプレゼンを五十分くらいで話すといったようなものです。
GoogleYahoo!Japan,Mozillaなどなど様々の会社の人がスピーカーとして話してました。

Developers Summit 2017 エンジニアとして生きる、技術の先にある現実に踏み出す


自分が聞いたプレゼン

自分は以下のようなプレゼンを見てきました。

  1. 「データテクノロジースペシャル」Yahoo! JAPANにおけるメタデータ管理の試み 吉野 彰真氏 [ヤフー]
  2. Google のインフラ技術から考える理想の DevOps 中井 悦司氏 [グーグル]
  3. エンジニアが働きたい場所で働けるために、チームに必要なこと 岡田 勇樹氏 [サイボウズ]
  4. Node.js の未来について 古川 陽介氏 [リクルートテクノロジーズ]
  5. MicrosoftのAI開発機能/サービス 佐藤 直生氏 [日本マイクロソフト]
  6. 新しいビルドターゲットとしての Webブラウザ。もしくは C/C++ で書く Web フロントエンドプログラム 清水 智公氏 [Mozilla Japan]

感想(4つ)

Yahoo! JAPANにおけるメタデータ管理の試み

Yahoo!JAPANという大企業がどのようにデータを対処していくかというのが今回のプレゼンの本筋で、データが重要になってきた情報社会でデータマネジメントの重要性が比例すること、また、そのためのメタデータが資産・情報管理の第一歩なることがよくわかった。例えばそのデータの価値、利用頻度、品質、人が取ってくるのか自動で取れるかといったようなものを課題ベースで決定し、データを可視化できるようにすることなど、バックエンド開発(インフラよりではないにしても)を勉強している自分も考えていかなければならない課題が新たに発見できたのでよかった。また、実践する際はやはりYahoo!JAPANのような大企業の真似から入るが手っ取り早いと感じた。
一発目からめっちゃ面白かった。


f:id:nktafuse:20170220182638j:plain



Google のインフラ技術から考える理想の DevOps

実際の開発環境例をベースにGoogleがどういった開発環境をつかっているか、どういった考えのもとで開発を行っているかというようなことが聞けた。
Googleの徹底的な合理主義、技術的な制約に対する洞察力は本当に素晴らしくて、見習いたいし、これから意識していこう思った。実際の開発ではコンテナ利用してレイヤーどとにしっかり分けること(例えば、OSレイヤーはアプリケーション開発側からはできるだけ隠蔽するとか)などにより、全体を最適化しスムーズに開発をおこなえるようになること。また、使う技術要素を理解し、システム全体のアーキテクチャを理解すること、そのためにソフトウェアの特性などを把握して知識としてのフルスタックを目指すことが大切ということがわかった。やっぱりGoogleの社員さんはカッコイイ!


f:id:nktafuse:20170220182204j:plain



Node.js の未来について

日本Node.jsユーザーグループ代表の古川さんの話が聞けてよかった。内容としては、今までのNode.js(v4v6v7)の機能の解説、そしてこれからのNode.js(v8v10)の話だった。v8からついにhttp/2のサポートが入り、今回はその解説となって早く使ってみたいと思った。また、v10からでる?と思われるES modulesの話もあり、ES modulesはいままでのNode.jsとは少し違ったものとなるのでとても興味深かった。Node.jsが好きな自分としてとても面白かった!


f:id:nktafuse:20170220182811j:plain



新しいビルドターゲットとしての Webブラウザ。もしくは C/C++ で書く Web フロントエンドプログラム

最近少し名前が出てきたWebAssemblyの話。冒頭にいきなりemccというコマンドを実行してcのコードからhtmlファイルとcssファイル
,jsファイルが出てきたときは驚いた!実際はEmscriptenというC/C++ のコードからウェブブラウザや Node.js などで動作する JavaScript を出力するコンパイラを利用することによって生成されている。元々、ウェブブラウザからゲームしたくね?という発想から生まれたらしいが、色々な場面で役立ちそうだし、何よりめっちゃ速い。凄く速い。自分はC/C++は書けないので実際に使えるようになるのはまだまだ先の話だけど、これからがとても楽しみな分野だと感じた。


f:id:nktafuse:20170220181450j:plain


まとめ

どのプレゼンも本当にとても面白かったです。二日目に行けなかったのが、悔しい。。 次こそ2日間いく!!!
技術的なものを得られたのはもちろんのことですが、しかしそれだけでなく、周りの実際に企業で働いている人たちやスピーカーの方々をみて、モチベーションのアップにも繋がりました。やはり、こうゆうコンファレンスなどは得るものが多くて改めて行ってよかったと感じます。

では!

初めてのクライアントサイドでAngularJSとMVCパターンの話

 

この記事はAizu Advent Calendar 201619日目の記事です。

前の人は@noah_orbergさん、次の人は@ababup1192さんです。

はじめに

 

いつもはサーバーサイドを中心に勉強しているんですが、最近クライアントサイドをAngularJSで書くことがあったので、勉強がてらそれら周りついて書きたい。

なので、書きます。

 

今回は、基本的なモジュールや機能をざっとまとめつつ、AngularJSの特徴でもあるMVCパターンについて書いていきます。

 

間違いがあったりするかと思うので、そこは指摘してもらえたら嬉しいです👏

 

AngularJSの話

 

f:id:nktafuse:20161219132715j:plain

 

 

 

AngularJSは、JavaScriptフレームワークの一つで、CRUD系のWebアプリケーション開発向きです。例えば、管理画面など変更があるところ。

フルスタックが魅力でフロントエンド開発において、大方の機能が使えます。

なので、環境構築で時間をとられることが少ない。便利!

特徴としては、

  • 双方向データバインディング
  • HTMLベースのテンプレート機能
  • シンプルなルーティング機能
  • ビルトインディレクティブ
  • セキュリティ対策

などなどがあり、とても高機能です。

 

ちなみにAngular 2なるものが出てきましたが、それはTypeScriptのフレームワーク

そっちも機会があればぜひ触ってみたい。。 

 

双方向データバインディング

双方向データバインディングとは、データとUIを双方向に結びつけて、UIとデータに相互性をもたせます。

モジュール

モジュールはアプリケーションが必要としているパーツの情報を持ったオブジェクトです。

なので、AngularJSでアプリを開発にするにあたって最初に行うのがmoduleを作ることで、それにはangular.moduleメソッドを使って以下のようにかきます。

 

var appModule = angular.module("appModule",[]);

第一引数にモジュールの名前、第二引数以降には依存するモジュールを書いていく。

ちなみに、作成するときは第二引数がいらなくても省略できないらしい。

 

 

ビルトインディレクティブ

ビルトインディレクティブとは、いわゆるAngularJSにおけるHTML拡張のことで、基本的に ”ng-” の形で定義されてそれがなんと、70個ほどあるそうです。(自分はちゃんと把握していません。。)

そこで、今回は2つほど紹介します。

ngRepeat

ngRepeatディレクティブは、コレクションから各項目のテンプレートをインスタンス化します。

 

構文例

<li ng-repeat="{item in items}">item:{{item}}</li>

itemsの要素itemをループを回して表示するイメージです。

また、$indexなどでループの回数など回数関係の値の取得も可能です。

 

ngController

ngControllerディレクティブは、ビューにコントローラーのクラスを割り当てます。

構文例

<div ng-Controller="myConroller"></div>

divの中にControllerの要素となるものをいれてControllerによって操作できるようにします。

 

以上のように高機能なHTML拡張が沢山あります。

 

ルーティング 

ルーティングは、Single Page Applicationを実装する上で重要な機能ですが、AngularJSでは簡単に実装できます。

 

下にroute.jsとしてtop.htmlとhoge.htmlとpiyo.htmlを設定するコード書いていきます。

 

angular.module("appModule",["ngRoute","ngAnimate"])
 .confing(function($routeProvider){
  $routeProvider
  .when("/top",{
    templateurl:"top.html"
   })
   .when("/hoge",{
    template:"hoge.html"
    })
   when.("/piyo",{
   template:"piyo.html"<
   })
   .otherwise({
    redirectTo:"/top"
   })
});

 

上から順に説明すると

一行目でmoduleの定義とngRouteとngAnimateを呼び出しています。

二、三行目はconfigサービスと$routeProviderでurlと読み込み先を紐付けています。

 

whenはrouteの追加。

otherwiseでは、ルートの定義がない場合のルーティングを定義しています。

 

他にもう少しあるのですが(Controllerの設定や、ngRouteとんngAnimateをheadで読み込ませるとか)基本的なルーティングは以上のように簡単に実装できます。

 

 

AngularJSの機能をいくつか見てきましたが、これはほんとごく一部で他にもいろいろあります。

ぜひ触ってみてください。

 

MVCの話

 

f:id:nktafuse:20161219133305j:plain

 

 

angularJSは、MVW(Model View Whatever)パターンのフレームワークであり、MVC(Model View Contrller)パターンであるとも言えます。

今までMVCパターンをなあなあな感じに把握していたのですが、調べてみると色々面白かったです。

なのでまあ、色々な考え方あるのだとは思いますが、MVCを上手に使う為の今の自分の認識を書きたいと思います。

 

では、MVCそれぞれの役割についてControllerを中心に見ていきます。

 

 

Controller

 

ここで、Controllerを使う場合の気をつけたい点を一つ。

 

Controllerは、肥大化させるべきではありません。

そう、いわゆるFat Controllerってやつです。

 

しかし、なぜControlllerは肥大化させるべきではないのでしょうか?

理由は単純で、Controllerへかくのは変更処理に対して弱くなりやすくなるからです。

基本的にControllerはViewの設計に引きずられてしまい、Viewの影響を受けやすいわけで。

 

Fat Controllerを作らない為に気をつけたいのは、ビジネスロジックをControllerに書かないことです。全てModelに任せてしまいましょう。viewやControllerに変更があってもModelには影響が少ないからです。

なので、基本的にControllerはviewとModelを操作することに限るべきです。

つまり、バインディングとイベントハンドリングの機能にしぼるのがいいと思います。

 

また、ModelとControllerのやりとりを一通的にすべきです。

どういうことかというと、Controllerが命令してそれに対してModelが答えるというスタイルをできるだけ心がけるべきということです。

そうすることにより、ビジネスロジックをControllerに書くことが圧倒的に減ると思います。

 

ゲーム機のコントローラーもプレイヤーとゲーム機本体の仲介役でしかないですしね。

そんなイメージでControllerを使ったほうがいいのかと思います。

 

f:id:nktafuse:20161219185206j:plain

 

Model

 

AngluarJSではserviceやfactory、valueなどというサービスを作ることができます。

 

service

serviceの構文例

 

angular.module.service("name", ["$window",function($window) { ...
}]);

* nameにserivceの名前、それ以降に依存サービスや関数を配列に入れる。

 

serviceは共有したいオブジェクトのコンストラクタを登録し、newインスタンスが生成します。

そのためプリミティブ型を提供できません。

なのでJavaScriptクラスを作る時に使うといいと思います。

 

factory

factoryの構文例

 

angular.module.factory("name",["$interval",function($interval) { ...
}]);

*nameにfactoryの名前、それ以降に依存サービスや関数を配列に入れる。

 

serviceにたいしてfactoryは、共有したい関数、値、オブジェクトを返します。

また、プリミティブ型を提供して、newでインスタンスしたくない時に使えます。

なので、関数、値を使いたい時に有効です。

 

以上の他にもvalueなど他のサービスがあります。

自分はserviceよりfactoryを多く使った。。。

 

 以上のようなサービスはControllerの配列に入れて、依存サービスとして利用できます。

また、Modelは一つのサービスにたくさんの処理を書くのではなく、役割や処理ごとに分割して作りましょう。そうすることによって、より変更などに強くなれます。

それらを利用して、つねにcontrollerをスリムに作ることを意識するのが大事です。

 

ここで、処理が多くなればどっちにしろModelも肥大化してしまうのでは?

という考えもでてくると思うのですが、それに関してはControllerが肥大化してしまうよりはModelが肥大化するほうがまだいいのです。

なぜかというと、ModelはViewの変更の影響がControllerよりは少ないからです。

なので、( Fat Model ) ,Skinny Controllerを意識しましょう。

 

 

View

  • Modelの状態を参照して表示する

viewが参照すべきなのは、ModelからでありControllerではありません。

なので、viewは表示と更新、ユーザーの入力をコントローラーに渡すことに専念させましょう。

 

 

以上のように、それぞれの役割を意識して書くだけでスリムでいいMVCがかけると思います。

 

参考情報 

この記事を書くにあたって以下のページを参考にさせてもらっています。

ぜひ見てみてください。

おわりに

 初めてクライアントサイドを書いたので全然知らないんですが、AngularJSなかなかいいです。他のフレームワークと比べるとフルスタックなんで、学習コストは高くなってしまいますが、(加えて、フレームワーク側の挙動が複雑でデバックが大変だったり)人気なのがなんとなくわかりました。次はAngular2も触ってみたい。

 

みなさんすごくつよい記事を書いているのに、全くコードを書いてないし説明がなってないし辛い。。

来年のAACはいい記事書けるように頑張りたい。。はい。。

 

では!

 

ブログ始めました。

こんにちは。初投稿です。

軽く自己紹介、現在大学一年生のなつめです。

 

なぜ、急にブログを始めたかというと、

今まで、ブログなんて登録すらしたことなかったのに、

友達とのノリでAizu Advent Calendar 2016に登録してしまった。。

そして、はてなブログにアカウント登録したわけで。

この際なので、ブログを始めてみることにした!

というわけです。

 

たぶん、プログラミングや趣味や近況報告がメインになってくると思う。

大学からプログラミングをはじめたもので、正直レベルは低いが、これから少しずついい記事を書けるようになっていきたい。

 

面白いかどうかわからないが、見てもらえたら嬉しい。

 

では!