Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all 21065 articles
Browse latest View live

【Flutter入門】シンプルなメッセージアプリのUIを作る

$
0
0

【はじめに】

Qiita初投稿です。学生エンジニアのKCPと申します。よろしくお願いします:smirk_cat:

2月からFlutterの学習を開始し、その一環としてこちらの記事Build a simple message app UI in Flutterを模写していたのですが、初心者にとっては解説が少なくわかりづらかったのでもう少し噛み砕いて説明していきます。

シンプルなメッセージアプリのUIのみを作っていきます。メッセージはできません。

【対象読者】

  • Flutterの環境構築が終わっている
  • なんとなくだがチュートリアルを一通り終わらせた
  • 初心者だけどいい感じのUIを作ってみたい

【今回作るもの】

スクリーンショット 2020-02-12 16.14.29.png

【実装】

1. 雛形を作る

まずは新しいプロジェクトを作ります。

$ flutter create message_app

カウンターアプリができると思いますが、一旦まっさらな状態にします。

main.dart
voidmain()=>runApp(MyApp());classMyAppextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){returnMaterialApp(home:HomeScreen(),);}}classHomeScreenextendsStatefulWidget{@override_HomeScreenStatecreateState()=>_HomeScreenState();}class_HomeScreenStateextendsState<HomeScreen>{@overrideWidgetbuild(BuildContextcontext){returnScaffold();}}

2. データの作成

まずはデータを入れるための新しいファイルを作成します。

場所はmain.dartと同じ階層のlibディレクトリの下です。

$ touch chat_model.dart

そしてこちらのサイトのAPIを利用してユーザーデータを作成します。

RANDOM USER GENERATOR
A free, open-source API for generating random user data. Like Lorem Ipsum, but for people.
https://randomuser.me/

ChatModelクラスを作成し、この中にデータを入れていきます。

chat_model.dart
classChatModel{finalStringavatarUrl;finalStringname;finalStringdatetime;finalStringmessage;ChatModel({this.avatarUrl,this.name,this.datetime,this.message});}

上から画像、名前、日時、メッセージを定義しました。

次に使用する6人のダミーデータを作成します。

chat_model.dart
classChatModel{finalStringavatarUrl;finalStringname;finalStringdatetime;finalStringmessage;ChatModel({this.avatarUrl,this.name,this.datetime,this.message});<!--追加-->staticfinalList<ChatModel>dummyData=[ChatModel(avatarUrl:"https://randomuser.me/api/portraits/women/34.jpg",name:"Laurent",datetime:"20:18",message:"How about meeting tomorrow?",),ChatModel(avatarUrl:"https://randomuser.me/api/portraits/women/49.jpg",name:"Tracy",datetime:"19:22",message:"I love that idea, it's great!",),ChatModel(avatarUrl:"https://randomuser.me/api/portraits/women/77.jpg",name:"Claire",datetime:"14:34",message:"I wasn't aware of that. Let me check",),ChatModel(avatarUrl:"https://randomuser.me/api/portraits/men/81.jpg",name:"Joe",datetime:"11:05",message:"Flutter just release 1.0 officially. Should I go for it?",),ChatModel(avatarUrl:"https://randomuser.me/api/portraits/men/83.jpg",name:"Mark",datetime:"09:46",message:"It totally makes sense to get some extra day-off.",),ChatModel(avatarUrl:"https://randomuser.me/api/portraits/men/85.jpg",name:"Williams",datetime:"08:15",message:"It has been re-scheduled to next Saturday 7.30pm",),];}

3. UI設計

やっとUIの実装に移ります:wink:

まずは先ほど作成したデータのファイルをインポートします。
main.dartの一番上に記述してある
import 'package:flutter/material.dart';の下に

import './chat_model.dart';を記述。

そうしたらとりあえずappBar部分を完成させます。

main.dart
@overrideWidgetbuild(BuildContextcontext){returnScaffold(<!--追加-->appBar:AppBar(title:Text('fluttermaster.com - Message Chat'),),);}

スクリーンショット 2020-02-12 17.14.54.png

body部分の作成に移ります。

メッセージしているユーザーのリストを作成するためにListViewウィジェットを作成します。

main.dart
body:Container(child:ListView.builder(itemCount:ChatModel.dummyData.length,itemBuilder:(context,index){ChatModel_model=ChatModel.dummyData[index];}),),

ListView.builder 関数に要素数を itemCount として、 一個一個の要素に対しての表示は itemBuilder を適応させます。

今回、 itemCount には ChatModel.dummyData.length が入っています。

この場合itemCountには先ほど6人分のデータを作成したので6を適応させていることになります。

main.dart
body:Container(child:ListView.builder(itemCount:ChatModel.dummyData.length,itemBuilder:(context,index){ChatModel_model=ChatModel.dummyData[index];        //追加returnColumn(children:<Widget>[ListTile(leading:CircleAvatar(radius:24.0,backgroundImage:NetworkImage(_model.avatarUrl),),title:Row(children:<Widget>[Text(_model.name),SizedBox(width:16.0,),Text(_model.datetime,style:TextStyle(fontSize:12.0),),],),),],);},),),

Coliumnをbodyとして表示する値としてListTileウィジェットを入れていきます。

ListTileは、ListViewの子ウィジェットとして使用でき、非常に整ったレイアウトのListViewを簡単に作れることとListViewの要素をタップした時などのイベントを容易に実装できるウィジェットです。

参照: https://saharablog.com/mobile-app/flutter-app/listtile/

leading
左端にウィジェットを追加。Iconが表示されることが多い。

title
真ん中にウィジェットを追加

subtitle
タイトルの下に表示されるサブタイトル

trailing
右端にウィジェットを追加

CircleAvatarはアバターなどを表示するときに円形にクリップしてくれるウィジェットです。
今回の場合はユーザーのアイコンに使われていますね。

ここまで書いたらほとんど終わったも同然です:kissing:

スクリーンショット 2020-02-12 18.05.07.png

4. 細かい修正

少しユーザー同士が寄りすぎているため、Dividerウィジェットを使って間隔を空けます。

main.dart
body:Container(child:ListView.builder(itemCount:ChatModel.dummyData.length,itemBuilder:(context,index){ChatModel_model=ChatModel.dummyData[index];returnColumn(children:<Widget>[//追加Divider(height:12.0,),//ここまでListTile(leading:CircleAvatar(radius:24.0,backgroundImage:NetworkImage(_model.avatarUrl),),title:Row(children:<Widget>[Text(_model.name),SizedBox(width:16.0,),Text(_model.datetime,style:TextStyle(fontSize:12.0),),],),),],);},),),

ボックスの全体の高さはheightによって指定され、色や線の厚さを変更することもできます。

Dividerについてはこちらに詳しく記載されています。Flutter公式ドキュメント: Divider

最後にメッセージとチャットしたいユーザーに飛べる矢印マーク(実際は飛べない)を追加します。

main.dart
body:Container(child:ListView.builder(itemCount:ChatModel.dummyData.length,itemBuilder:(context,index){ChatModel_model=ChatModel.dummyData[index];returnColumn(children:<Widget>[Divider(height:12.0,),ListTile(leading:CircleAvatar(radius:24.0,backgroundImage:NetworkImage(_model.avatarUrl),),title:Row(children:<Widget>[Text(_model.name),SizedBox(width:16.0,),Text(_model.datetime,style:TextStyle(fontSize:12.0),),],),           //追加subtitle:Text(_model.message),trailing:Icon(Icons.arrow_forward_ios,size:14.0,),),],);},),),

完成!よっしゃ!

スクリーンショット 2020-02-12 18.37.00.png

【参照】

さはらのブログ:https://saharablog.com/mobile-app/flutter-app/listtile/
わかりやすいFlutterリファレンス:https://nzigen.com/flutter-reference/2018-04-17-list-view.html
Flutter Widget catalog:https://flutter.dev/docs/development/ui/widgets
Flutter Master:https://fluttermaster.com/build-a-simple-message-app-ui-in-flutter/

【最後に】

マークダウン記法とかあんま知らんくてめっちゃ時間かかってしまった。

自分も始めたばかりなので何か間違いや知っておくべきことががあればご教授お願いします:pensive:


AWS試験対策(③コンピューティングとストレージ続)

$
0
0

自分用メモ、昨日の続きから

 セキュリティグループ

セキュリティのルールをまとめた仮想FW。許可したいものだけ記載するホワイトリスト方式。
インバウンドは外から内へ、アウトバウンドは内から外への通信。
基本的に使うポートだけ開ける(インバウンドに記載する)。
開けすぎると攻撃受ける箇所が多すぎてセキュリティリスクであるから。
EC2のポートを開けるというよりは、ルールを作ってそこにEC2が従う的な感じ。
何が違うかって言うと、22と80のポートを開けたいサーバが2つあったとき、各それぞれに設定を作らなくて良くて、一度設定を作ったとこに所属させれば良い。お手軽。

セキュリティグループはステートフルといって、外へのトラフィックのについての、戻りのトラフィックは自動的に許可されるって仕組みらしい。
球技で例えるとわかりやすいかも。テニスとか。
フォアハンドで打ったものがバックハンド側に返ってきても受け取れる。みたいな。
しかし、相手のサーブをバックハンドで受け取るには、準備してないと受け取れないよーってな感じ。

また、アクセス元もセキュリティグループで指定できます。Aに入ってるサーバからのインバウンドはうけとるよーって感じ。IPでアクセス元の指定をしてたら、5台あれば5個の設定が必要だけど、セキュリティグループでの指定ならその5台をグループに入れちゃえばいいだけ。お手軽。

プレイスメントグループ

一緒のAZなら通信が早いよってこと。深く考えずに、近いんだから早いやろってくらいの気持ち。

監視

メトリクス(CPU使用率とかのリソース監視)はcloudWatchってサービスでできる。SNSを使ってメールで通知することもできる。
また、ログ監視したい場合はインスタンスにエージェント入れればcloudWatchにあつめてくれる。

auto recovery

ハードウェア障害とかが起きたときの対応を設定しておくことで自動的にやってくれる。
ハードウェア障害の際に、自動再起動を仕込んでおけば、落ちっぱなしじゃなくて別ホストコンピュータにて起動されて復帰が早くなる仕組み。
一応、ホストコンピュータ側だけじゃなく、インスタンス側の障害の場合でもauto recoveryは使える。

AWS marketplace

予めソフトウェアがインストールされてるAMIを購入できる。インスタンス作ってからソフトウェアインストールする手間が省けるから便利。

一旦区切り、次回EBSから。

PHP クラスの定義とインスタンスの作成

$
0
0

目的

  • クラスの定義方法とインスタンスの作成方法を記載する

用語

  • クラス内で定義される変数: プロパティ
  • クラス内で定義される関数: メソッド

クラスの定義

  • 下記にUserクラスを定義する。
  • nameプロパティを定義する。
  • Hi, i am プロパティとなるようなsayHiメソッドを定義する。
classUser{// プロパティの宣言public$name;//constructの宣言publicfunction__construct($name){$this->name=$name;}// メソッドの宣言publicfunctionsayHi(){echo"Hi, i am $this->name";}}

インスタンスの作成

  • 先に定義したクラスの下で下記の行を記載する。
$miriwo=newUser("miriwo");

インスタンスのメソッドを使用する

  • 下記にUserクラスを元に作成したmiriwoインスタンスを使用してsayHiメソッドを実行する。(>の後ろは出力)
$miriwo->sayHi();>Hi,iammiriwo

【初級】ネットワークトラッシュ

$
0
0

ネットワーク初心者で機器間通信ができない事象の原因把握に苦労したので。

基本的なネットワーク用語

  • ISP(Internet Service Provider):ネット提供会社(SOFTBANK、ドコモなどなど)
  • ONU(Optical Netowork Unit:光回線の終端装置):
    分かりやすく言うと機器と機器間、機器とパソコンの間中継器
  • Private IPアドレス(内部IPアドレス)
    こちらのIPアドレスは内部のIPアドレス

    • 10.0.0.0~10.255.255.255
    • 172.16.0.0~172.31.255.255
    • 192.168.0.0~192.168.255.255
  • Global IPアドレス

    • Private IPアドレス (PublicIPアドレス)

グローバルIPアドレスはパブリックIPアドレスとも呼ばれ、インターネットに接続されているコンピュータや通信機器を個々≻に特定するための一意で割り当てられたIPアドレスのことです。 インターネット上の住 k所にあたり、インターネットに接続≻する際に必ず必要です。 IPアドレスは次のような表記で表されます。www.idcf.jp › 用語集から引用

  • NAT (Network Address Translation)
    • ある範囲の内部IPアドレスを任意のGlobalIPアドレスに変換、ネットワークが使える技術。
  • DNSサーバ:ドメイン名(www.google.com)をIPアドレス(172.217.175.14)に変えてくれるどこかのサーバ

Windows環境

ping

アプリケーション、機器、ネットワークの疎通性を確認するutilityである。

  • Echo request messages 送信
  • Echo reply messages 受信
C:\Users\Gwakly>ping 8.8.8.8  👈宛先、google.com を入れてもOK

Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=22ms TTL=50
Reply from 8.8.8.8: bytes=32 time=34ms TTL=50
Reply from 8.8.8.8: bytes=32 time=54ms TTL=50
Reply from 8.8.8.8: bytes=32 time=135ms TTL=50

Ping statistics for 8.8.8.8:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 22ms, Maximum = 135ms, Average = 61ms
  • Good
    • 4∼5回の基本的な死活、Echo request/replyの時間、TTLが簡単にできる
    • 反応が早い
  • Bad
    • 機器の死活以外は確認が難しい
  • オプション
    • -a IPアドレスでホストネーム知りたい場合使う。
    • -n エコリクエストを何回送るか指定する
    • -t Control+C を押すまでにはPingを継続。ホストが再起動をなどをする際立ち上がる流すと便利。

tracert

C:\Users\Gwakly>tracert 8.8.8.8

Tracing route to dns.google [8.8.8.8]
over a maximum of 30 hops:

  1     1 ms    <1 ms    <1 ms  192.168.0.1
  2    32 ms    60 ms    35 ms  61-24-xxx-xxx.rev.xxx.ne.jp [61.24.xxx.xxx]
  3   195 ms    20 ms   209 ms  10.202.xxx.xxx
  4    61 ms    24 ms    76 ms  10.1.xxx.xxx
  5   168 ms   196 ms    32 ms  203-165-19-245.rev.home.ne.jp [203.165.19.245]
  6    78 ms    24 ms    76 ms  c1-h0-0-0-1.ot-dc.zaq.ad.jp [203.165.19.246]
  7   104 ms   102 ms   101 ms  203.165.0.202
  8    93 ms    18 ms   114 ms  220-152-35-118.rev.home.ne.jp [220.152.35.118]
  9    79 ms   101 ms    20 ms  209.85.244.45
 10    55 ms    78 ms    23 ms  172.253.70.183
 11    74 ms    29 ms    74 ms  dns.google [8.8.8.8]

Trace complete.
  • Good
    • 機器までの経路が追跡できる
    • pingコマンドとは違ってループなどが確認できる
  • Bad
    • pingより遅い
    • 初心者はパットみて分かりずらい

pathping

C:\Users\Gwakly>pathping 8.8.8.8

Tracing route to dns.google [8.8.8.8]
over a maximum of 30 hops:
  0  LAPTOP-xxx.edogx1.kt.home.ne.jp [192.168.xxx.xxx]
  1  192.168.xxx.xxx
  2  61-24-xxx-xxx.rev.home.ne.jp [61.24.xxx.xxx]
  3  10.202.xxx.xxx
  4  10.1.xxx.xxx
  5  203-165-19-245.rev.home.ne.jp [203.165.19.245]
  6  c1-h0-0-0-1.ot-dc.zaq.ad.jp [203.165.19.246]
  7  203.165.0.202
  8  220-152-35-118.rev.home.ne.jp [220.152.35.118]
  9  209.85.244.45
 10  172.253.70.183
 11  dns.google [8.8.8.8]

Computing statistics for 275 seconds...
            Source to Here   This Node/Link
Hop  RTT    Lost/Sent = Pct  Lost/Sent = Pct  Address
  0                                           LAPTOP-xxx.edogx1.kt.home.ne.jp [192.168.xxx.xxx]
                                0/ 100 =  0%   |  
  1   20ms     0/ 100 =  0%     0/ 100 =  0%  192.168.xxx.xxx
                                0/ 100 =  0%   | 👈 区間でのパケットの送受信状況が分かるので便利
  2   62ms     0/ 100 =  0%     0/ 100 =  0%  61-24-xxx-xxx.rev.home.ne.jp [61.24.xxx.xxx]
                                0/ 100 =  0%   |
  3   86ms     0/ 100 =  0%     0/ 100 =  0%  10.202.xxx.xxx
                                0/ 100 =  0%   |
  4   66ms     0/ 100 =  0%     0/ 100 =  0%  10.1.xxx.xxx
                                0/ 100 =  0%   |
  5   68ms     0/ 100 =  0%     0/ 100 =  0%  203-165-19-245.rev.home.ne.jp [203.165.19.245]
                                0/ 100 =  0%   |
  6   68ms     0/ 100 =  0%     0/ 100 =  0%  c1-h0-0-0-1.ot-dc.zaq.ad.jp [203.165.19.246]
                                0/ 100 =  0%   |
  7   70ms     1/ 100 =  1%     1/ 100 =  1%  203.165.0.202
                                0/ 100 =  0%   |
  8   70ms     0/ 100 =  0%     0/ 100 =  0%  220-152-35-118.rev.home.ne.jp [220.152.35.118]
                                0/ 100 =  0%   |
  9   71ms     1/ 100 =  1%     1/ 100 =  1%  209.85.244.45
                                0/ 100 =  0%   |
 10   75ms     0/ 100 =  0%     0/ 100 =  0%  172.253.70.183
                                0/ 100 =  0%   |
 11   67ms     0/ 100 =  0%     0/ 100 =  0%  dns.google [8.8.8.8]

Trace complete.
  • Good
    • 区間でのパケットの送受信状況が分かるので便利
    • 送信経路が分かり安く可視化できる
  • Bad
    • 場合によっては時間が結構長いので急ぎの場合は避けた方がよい

nslookup

よくDNSサーバの問題の場合があるのでDNS情報(DNSサーバ)を調べる時に利用

Linux環境

traceroute

参考サイト
Microsoft pathping (https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/pathping)
traceroute(tracert) ~ネットワークの経路を調査する(https://www.atmarkit.co.jp/ait/articles/0108/30/news003.html)

AWS試験対策(④コンピューティングとストレージ続々)

$
0
0

ストレージ〜自分はストレージのことよくわかってない気がするけどなんとか生きてる。この機会に覚えたいと思う。

EBS

cドライブみたいなもん。こいつは一途だから一つのインスタンスにしかくっつけない。一方、インスタンスくんはたくさんのEBSちゃんをたぶらかすことが可能…。
同じAZのインスタンスにのみくっつける。一途な割には遠距離恋愛不可。
他のAZのインスタンスとどーしてもくっつきたい場合は、s3に写真をあげて、くっつきたいインスタンスがあるところで写真からクローン作ればオッケイ。

容量は1GB単位で指定できる。最大は16TBまで。最初に10!って宣言しちゃって、後からやっぱ15ほしいわ!とかもできる。

この子はインスタンスに一途だけど運命共同体ではない。インスタンスがいなくなってもこの子は生き続ける。たくましい。

EBS最適化インスタンス

デフォルトで無効。
インスタンス君はEBSちゃんだけじゃ飽き足らず、いろんなとこに通信というちょっかいを出しに行きます。
なので、忙しくてEBSちゃんへの連絡が遅くなったりします。しかしこのオプションをつければ、EBS専用の回線ができて、他の子に邪魔されることがない!ってなやつです。

ボリュームタイプ

汎用SSD
いわゆる一般的なやつ。

プロビジョンドiops
汎用じゃスピード足りねえな!ってときに使う。DBとか。

スループット最適化HDD
シーケンシャルアクセス時に高い性能。要するに大きいデータを処理するのが得意だという。

コールドHDD
同じく大きいデータを処理するのが得意だけど、スループット最適化よりは劣る。劣ってても安いほうがいいなら使うんじゃないかな。

マグネティック
コールドHDDよりもさらに安い。しかしさらにパフォーマンスは劣る。旧世代のものだからあまりおすすめされない。

名前で覚えれそう。汎用は普通の。IOPSはI/O早い。スループット最適化は大きいデータ。コールドはそれの劣化。マグネティックは更にそれの劣化。でも安いからめったに使わないデータとかならこっちのほうがいいんちゃうか。

EBSスナップショット

要するにバックアップを圧縮してS3ってとこに保管してるよって話。S3で中身にアクセスすることはできない。
増分のバックアップをしている。一枚目はすべてを保存してる。2枚目は、一枚目と二枚目の違うとこだけ保存してる。
となると、途中を消しちゃ困るような気がするけども、ちゃんと考えてて、その場合は3枚目と違うとこだけ消える。文字だと何言ってるかわからないなこれ。。。
5枚目がA.B.Cってデータを持ってて、6枚目はCがDになってたため、Dのデータを持ってる。
その場合、5枚目を消そうとしてもA.Bは残ってCだけ消える。Cは2枚目でDになってて必要ないからな。
言ってて更にわかりにくくなったけど、とりあえず増分バックアップしてるってことだけ覚えればいいかも

初期化

新規作成の場合、作ってすぐに最高のパフォーマンスを出せるけど、スナップショットから生成した場合はそうはいかない。
アクセスしたことがないデータがあるから、動作がどーしても遅くなる。
じゃあどーすればいいかって、全部事前にアクセスしとけばいいじゃん!ってのがこの初期化。

EBSの課金

確保した分だけ課金される。
10GB分確保しておいて、実際1GBしか使ってなくても10GB分請求される。
さっきも言ったけどインスタンス君が死んでもこの子は生き続けるので課金マジ注意。

EBS暗号化

新しく作るときか、スナップショットからクローンを作るとき、暗号化できる。そのままでは暗号化できない。
暗号化されたやつのスナップショットは暗号化されてる。AES-256って形式のみらしい。

S3

オブジェクトストレージといい、ファイル構造を持たない。
データを入れる器をバケットと言う。
オブジェクトキーはファイルの名前。プレフィックスというものを使って階層構造のようなものをつくってる。
実態はファイル構造を持たないけど、ファイル構造のように見せるためにプレフィックスという属性をつけてるみたいな。

EBSへアクセスするときは同じAZじゃなきゃいけなかったけど、S3の場合は同じリージョン内まで可能。なぜなら、VPCエンドポイントというものを使うから。
VPCエンドポイントは、s3と通信を行うときの中継地点的なもの。s3はVPCの外にあるからこの中継点がないと繋げない。インスタンスとバケットの中継地点と覚えていいかも。

特徴は、ファイルを3箇所以上のAZのDCに保存するから耐久性が高い。
結果整合性モデルが使われている。どういうことかというと、書き込んだり削除したりすると、3つのDCすべてに反映されるまでにラグがあるよってこと。
削除指示してすぐに一箇所目からは消えたけど3箇所目にはまだ残ってるからアクセスできたりする。
名前通り、結果的に一緒になってればいい、整合性とれてればいいってこと。

容量は無制限で安い。使った分だけ課金される。

S3ストレージの種類

S3標準
その名の通り標準的なやつ。

S3 Intelligent-tiering
データへのアクセス頻度を判別してくれて、自動的に適切なとこに移してくれる。よく使うのはそのまま、使わないのは取り出すのに手間かかるけど安いとこにしまっておくとかそういうことをしてくれる。

S3標準-IA
あんまアクセスしないけど、必要なときはすぐほしい!ってものを入れる。安くしまえるけど、取り出すときにもお金がかかる…

S3 1ゾーン-IA
アクセスしないものを入れる。名前のとおり、従来では3箇所にしまってたけどこのプランは一箇所にしかしまわない。
一応耐久性はめちゃくちゃあるらしいけどAZ全体が破壊されたらデータはなくなる。戦争かな?
一箇所だから安い。もともとの標準も大概に安いからあんま恩恵受けないような気もするけど、死ぬほど大きなデータをしまう際には結構変わってくるんだろうな…

S3 glacier
テープバックアップらしい。やっすいけど取り出しのときにお金だけじゃなく時間もかかる。
グレイシア…氷…冷凍保存…って覚え方。

主要機能

バージョニング
世代管理できる。エクセルの過去のバージョンの復元みたいなやつ。これ使うとバージョンごとに保存されて容量増え続けるから注意。
MFA deleteという、多要素認証消去って機能がある。間違って消す操作しても他の要素で認証しないと消せないって仕組み。間違って消すオペレーションミスを防げる。

ライフサイクル
一定期間経ったオブジェクトをどうするかルールを決めれる。
移行ならIAとかグレイシアに移して安く済ませれる。
失効なら自動削除してくれる。

静的ウェブホスティング
静的なコンテンツ(掲示板のように変化のあるものじゃなくて、いつ開いても同じ結果が帰ってくるサイト)をS3に置くとWEBサーバ要らずにWEBページを公開できる。俺はこれを知らなくて、静的コンテンツなのにわざわざEC2をなんやかんやしてた…悔しい…
サーバーいらずなので最低限のメンテナンスだけで使えるのが強み。
パブリック読み取りアクセス権をつけないと使えないので注意。
HTTPSがつかえないのも注意。
スクリプトは、ユーザー側のスクリプトは含められるけどサーバー側のスクリプトは駄目。

暗号化
3つのサーバーサイド暗号化機能がある(SSE)

  • S3で管理されたキーによる暗号化
    暗号化キーの管理をAWSが行う

  • KMSで管理されたキーによる暗号化
    暗号化キーの管理にKMSを使う。権限制御や証跡が取れる。

  • ユーザーが用意したキーによる暗号化
    暗号化キーの準備及び管理はユーザーが行う。

アップロードしたときに暗号化するデフォルト暗号化オプションでは上2つのどちらかが使われる。

署名付きURL
S3のデータにアクセスする期限を決めたいとき、URLに有効期限をつけれる。期間限定のコンテンツを配信したいときに使う。
署名をつけない場合、期限なし。

その他

クロスリージョンレプリケーション
別のリージョンのバケットにオブジェクトのコピーを自動でとってくれる。コピーは非同期。

S3 object tagging
オブジェクトにタグをつけてくれる。

S3分析-ストレージクラス分析
S3のデータを分析して、より安価なストレージクラスに移行するタイミングをおしえてくれる。Intelligent-tieringと違うんこれ?提案だけで移してはくれないってこと?

S3インベントリ
オブジェクトのリストを定期的にCSV出力してくれる

S3 cloudWatch metrics
S3に対してのリクエスト量とかダウンロード量をcloudWatchで監視できる。

cloudtrailによる監査ログ取得
いつどこから誰がS3の操作を行ったのかというログを収集できる。

S3オブジェクトのアクセス制御

基本的にバケット作成主だけアクセスできる。
誰でもオッケーにしたいなら、パブリックアクセスを有効にする。

IAMポリシーによるアクセス制御
IAMポリシー(ルール)を作成し、IAMユーザーにオブジェクトに対してのread/put/deleteの権限付与できる

ACLによるアクセス制御
バケットそのもの、またはオブジェクト一個一個にアクセス権限を設定する。xml形式。

バケットポリシーによるアクセス制御
バケットそのものに対してのアクセス制御。IPアドレスで制限できたりする。JSON形式

パブリックアクセス
誰でもオッケーにしたいならパブリックにGET権限を付与します。
バケットポリシーを使えばすべてのオブジェクトにパブリックアクセスを設定できる。
ACLでやるならオブジェクトごとにパブリックアクセスを設定できる。
IAMのWEBアイデンティティフェデレーションを使えば、一時的なアクセス権も与えられる。

S3へのアクセス

REST APIを使う。マネジメントコンソールからか、CLIからか、SDKからアクセスできる。

content-MD5による完全チェック
ファイルアップロードの時にハッシュ値確認して、かけたりしてないか確認できる

マルチパートアップロード
一回のアップロードに5GBまでしか行けないので、5GB以上なら分割してアップロードしなきゃいけない。最大5TB。

ランダムなプレフィックス
連続でアップロードすると、同じとこばかり書き込んでると待ちが発生して効率悪いから、ランダムにしてIOのパフォーマンスをあげてる。

制約事項

バケット数は一つのアカウントで100まで。上限緩和申請すればもっとつくることもできる。
また、バケットの名前はかぶっちゃいけないし変更できない。かぶらないようにって変な名前つけると変更できなくて後悔するぞ!
また、バケットを人にあげることはできないです。

次回コンテナへ!

【進路別】キミがHTML/CSSの次にやること【駆け出しエンジニア】

$
0
0

この記事で言いたいこと、知ってもらいたいこと。

こんにちわ!
プログラミング学習をはじめて1年半くらい経過する、準・駆け出しエンジニアです。
モチベーションアップのため、純・駆け出しエンジニアの皆様とつながりを持つ機会が多いのですが、ずっと気がかりだったことがあります。
HTMLとCSSを学んだ後のキャリア選択についてです。

なんで皆、jQueryとBootstrapでポートフォリオつくってるの?

それが悪いというわけではありません。
しかし、駆け出しのエンジニアを自称しているのに、
上記のようなWEBデザインの領域で身を固めようとしている人があまりに多く、違和感を感じました。

SNSで疑問を投げかけてみたところ、駆け出しエンジニアを提案している先導者が、
なぜかWEBデザインに寄ったロードマップを提案しがちだという話を耳にしました。

せっかくエンジニアに興味を持ったのに、デザイナーになる道しか知らないなんて、もったいない!
そう思い、皆様より少しだけ先輩の自分が、皆様の目指すべく道のヒントを提供することによって、
皆様がより強く望む道へ進んでいただけたらと思い、執筆しました。

※駆け出しではない皆様へ。
この記事の内容に「ん?」っと思われる可能性があることは、想像に容易いです。
ただ、自分ひとりの意見を「うんうん」と悩んで精査するよりも、
コメント欄でたくさんの経験者の意見を募り、それも踏まえて駆け出しエンジニア様方が参考にしていければと思っておりますので、
意見の相違などもバシバシコメントいただければと思います。

需要

そんなこと言ったって稼ぎたい!
一番需要のある仕事を教えて!と思ったアナタ。
これから、そのあたりも合わせて説明しますが、ぶっちゃけ、どれも需要はあります。
なので、自分がやってて楽しい仕事で、楽しくスキルアップを続けていくのが、一番稼げるようになる方法だと思うなあ。

スキルの選び方

じゃあ、どんなスキルを真っ先に上げていくのか?という事が気になりますが、
まずは具体的な話をする前に、自身の適性をきちんと自覚してみましょう。
以下の3つの作れる物のなかで、あなたが一番テンションがあがるものはどれですか?

  • デザインに凝ったWEBサイト
  • 世の中にあふれるWEBサービス
  • 先進的なWEBアプリ

この中で、どれを作れると聞いた時に一番ワクワクするのかで、あなたの適性を判断します。

WEBサイト

写真をふんだんに使用した美しいサイト、
CSSをフル活用した今風でモテかわリッチなサイト。
Appleのホームページのような、デザインに凝ったサイトだったり、
はたまた合理性を究極的に追求した、シンプルイズベストなサイトなど、

「細けぇこたぁどうでもいい、WEBはとにかくデザインだ!!」

そんな、WEBサイトにときめくあなたは、WEBデザイナーに向いています。

WEBサービス

店舗検索サイト、求人情報サイト、SNSなど、
世の中のビジネスを構成するWEBサービス。
企業が喉から手が出るほどほしがる、インターネットビジネスの基幹と言っても過言ではありません。

「世の中のビジネスを構築してる、WEBサービスが作りたい!!」

そんな、WEBサービスにときめくあなたは、バックエンドエンジニアに向いています。

WEBアプリ

時代の進化はすばらしい。
少し前までのWEBサイトは、更新したり、ページを移動したり、とにかく動きがぎこちない。
今じゃ、ブラウザでWEBを開くだけでも、アプリのようなリッチなコンテンツがたくさん見つかります。

「時代の先へ進みたい!アプリっぽいのを作りたい!」

そんな、WEBアプリにときめくあなたは、フロントエンドエンジニアに向いています。

職種別の解説

では、ざっくり適性を自覚して頂いたところで、各職種について簡単に説明します。

WEBデザイナー

WEBデザイナーは、駆け出しエンジニアのロードマップとして提案される率が非常に高いです。
WEBサービスの、機能的な中身にはあまり触れず、Adobeソフトやデザインの知識をフル活用して働きます。
エンジニアには触れさせない、WEBデザインの世界を作り上げることができます。

メリット

  • 身近な存在。
    プログラミングって結局なんなの? WEBサービス?アプリ?どゆこと??
    WEB業界に親しみの少ない層からしたら、正直そんな感想です。
    エンジニアとして駆け出す前のアナタも、もしかしたらそういう感じだったかも?
    そう考えると、自分が一番想像しやすく、周りの人にも想像しやすい、そんな親しみのある作品を作れるというのは、
    デザイナーの一番のメリットかもしれません。
  • プログラミングが不要。
    プログラミング、やっぱり難しいです。
    理解しづらい知識や話が多く、考えるだけ頭がイタタ…
    そこまで頭を悩ませて、作り上げた作品は素晴らしいものかもしれませんが、
    そこに興味のない人であれば、無理に力を使う必要はありません。
    「動き」より「見た目」を作りたい、そんなあなたは、絶対にデザイナー向きです!

デメリット

  • 競合過多で薄給。
    そもそも、この記事をかいたきっかけが、デザイン方面に進む駆け出しエンジニアが多いということなので、
    説明する必要もないのですが…
    PCを使う仕事がしたい、でもやりたいことはプログラミングではない。
    そんな人達が最近、こぞってWEBデザイナーとしてデビューしています。
    世の中は椅子取りゲームです。厳しい道程ですが、人を納得させる素晴らしいデザインを作り上げ、ぜひ頂点を目指して頑張ってほしいです。
  • 答えのない問題への直面
    デザインの難しいところは、答えがないところです。
    「なんか違う」「もうちょっといい感じにして」そんな要望を言われることも、たまにはあるでしょう。
    持ち前のセンスを活かして、素晴らしいデザインを作り上げていきましょう。
    (「答えのあるデザイン」を採用している職場に入るとしたら、そこでのWEBデザイナーの発言力は、少し弱いかもしれません。)
  • 常に勉強
    デザインに究極はありません。
    時代とともに流行っては廃れ、常に追いかけっこの世界です。
    さらに、WEBの世界では「作り込めばOK」というわけにはいきません。
    人々が使いやすく、スマホやPCに負担をかけないデザイン。
    そんな、答えのない答えを追い求めて、勉強や、情報収集を続けていく必要はあります。

バックエンドエンジニア

バックエンドエンジニアは、これまでWEBエンジニアと呼ばれていました。
WEBでプログラミングを使うといったらまずこの仕事。
WEBに存在するサービスは、全てバックエンドエンジニアが作り上げてきたと言っても過言ではありません。
あらゆるWEBを作り上げてきた職種だからこそ、キャリアのあるエンジニアの人口がとても多いです。

メリット

  • 需要の多さ。
    世の中のWEBサービスを作っているのはバックエンドエンジニアです。
    世の中からWEBサービスがなくならない限り、バックエンドエンジニアも永久に不滅でしょう。
    食いっぱぐれはありません。安定志向のあなたにオススメ。
  • 規模感のデカさ。
    企業に対してWEBサービスを制作する立場であれば、他の二職種に比べても、制作物の規模感はダントツと言ってよいでしょう。
    そのために立場も強く、WEBに詳しくない人に仕事の話をするときも、自然にドヤる事ができるでしょう。

デメリット

  • 周りにバリキャリの先輩が多い。
    昔からWEBサービスを作ってきた先輩方の多くはバックエンドエンジニアです。
    これから駆け出しで勉強するとしたら、周りにはキャリアがバリバリの先輩もたくさん居るでしょうし、
    出遅れもいいところだという状況も、珍しくはないでしょう。
    しかし、頼れる先輩や、理解を得られる仲間がおおいという言い方もできます。ようは考え方次第です。
    ポジティブピーポー、略して「ポジピ」になりきって、頑張りましょう!
  • 下手したらブラック
    「エンジニアは人手不足」と聞いたことはありますか?
    世の中のWEBサービス開発の需要に追いつかず、エンジニアは供給不足になっています。
    その結果なにが起こるかと言うと、技術研修は十分にできず、しかし顧客の要望に答えるために長時間労働を強いられる。その上給料は安いまま。
    もちろんそんな企業ばかりということではありませんが、他職種と比べると、そんな経験談を聞く機会は多いかもしれません。

フロントエンドエンジニア

フロントエンドエンジニアは、近年誕生した仕事です。
力不足で頼りなかったブラウザ用のプログラミング言語が、進化を遂げてひとつの職種を作り上げました。
今じゃ見違えるようにリッチなコンテンツを、ブラウザ上で実行することだってできます。
もう、スマホアプリと見分けがつかないレベルまで来ています。
なんならアプリだって作れます。それも気になるとしたら、ここが一番の近道です。

メリット

  • とっても先進的。
    SPA(シングルページアプリ)という言葉は聞いたことがありますか?
    今まで、画面の更新や、ページの遷移が伴っていたWEB上のシステムですが、
    最近は、ページを移動せず、アプリのようにするする動作する「SPA」が増えてきています。
    このような作品を制作するのは、そう、フロントエンドエンジニアです。
    いままでより未来へ、飽くなき探究を続けていく、好奇心旺盛なあなたに、とってもオススメです。
  • 空きポジションが狙えるかも?
    古来よりWEBサービスを制作してきたのはバックエンドエンジニアです。
    具体的には、サーバーサイドのプログラミング言語を駆使して、サーバーでの処理やページの遷移など、あれやこれやを色々駆使して大規模な制作をしてきた、偉大な方々です。
    それはもちろん素晴らしいことですが、今までずっとサーバーと向き合ってきたエンジニアの中には
    「ブラウザ言語なんで信用できない」「ブラウザで色々やるなんて発想はないし、やり方も知らない」
    そんな人も、一定数いると思います。
    そんな中、フロントエンドがリッチになってきた今の時代に学習を開始できた自分たちはとてもラッキーです。
    HTML5、CSS3、JavaScriptのES6や各種ライブラリをリッチに使用したコンテンツをネイティブで学べる自分達は、とても恵まれた状況に居るのかもしれません。
    この環境を活かして頑張れば、フロントエンドのチーフになることも、夢ではない…のか…!?
  • 将来的に色んなものが作れるように…?
    ブラウザ言語というのは、すなわち「JavaScript」のことなのですが、
    こいつの「俺が俺が」感はすさまじいものです。
    いままでは、サーバーやるならサーバー言語、アプリをやるならアプリの言語、と適材適所の言語を学んでいくやり方が普通でした。
    しかしJavaScriptは目立ちたがり屋さんです。
    ブラウザでプログラミングを使うならもちろんJavaScript。
    サーバーサイドやWEBサービスをやりたいなら、Node.jsとExpress。
    アプリを作りたいなら、Node.jsとElectron。
    このように、なんでもやりたがる、じゃじゃ馬な存在です。
    ひとつの言語でいろいろ作れるようになるというのは、人によっては魅力に感じるかもしれませんね。

デメリット

  • ポジションの確保は大変。
    先述した通り、フロントエンドをよく分かっていないエンジニアは一定数居ます。
    たとえば会社に入って、いままでやってきた事とは全然違うやり方でものを作りましょう!
    と新人が提案してきたとして、白い目で見られるかもしれません。
    持ち前のコミュニケーション能力をフル活用して、自身のポジションを確立する必要があるかもしれませんね。
    また逆に、現時点でフロントエンドを積極採用している企業があったとします。
    今までバックエンドがメインだったIT業界で、既に実務レベルでフロントエンドを使いこなしているプロジェクトメンバーが居るということです。
    それってつまりどういうことでしょうか?
    その人はあらゆる知識を進んで探求している、全知全能の神のようなエンジニアだということです。
    全知全能エンジニアの近くで働くには、それなりの実力を身に着けていかなければならないかもしれません。
    しかし、それもまた、神が下した試練なのかもしれませんね。アーメン。
  • 常に勉強。
    WEBデザイナーと同じような話になりますが、
    どんどんコンテンツがリッチになっていくこの世界で
    「よし、ここまでリッチになったらもう十分やろ。」
    と皆が判断し、JavaScriptの進歩が止まる日は来るのでしょうか?
    はい、ありえませんね。
    フロントエンドの世界もまた、時代と技術の追いかけっこです。
    飽くなき探究心を、惜しげもなく発揮していってください。
  • だけじゃない。
    テレビCMのような言い方になってしまいましたが…。
    今までバックエンドエンジニアが築き上げてきたIT業界で、
    最先端のフロントエンドの技術だけ習得して、それだけで、構築や実装なども含めた、
    すべての仕事がフロントエンドで完結するでしょうか?
    それはありえません。
    フロントエンドで活躍するということは、これまで使われてきたバックエンドもそれなりに理解する必要があるということです。
    結局のところ、フロントエンドでやっていくには、バックエンドの勉強も必要になってくる可能性が高いです。
    (逆もまた然りですが。)
    でも大丈夫、飽くなき探究心を持ってWEBアプリに憧れを抱くあなたなら、
    作れるものが増えていく嬉しさが、勉強の辛さに打ち負けるはずはありません。

必要な技術

では、HTML/CSSの次の段階として習得すべき技術と、それを学ぶのに適切な練習作品の例を説明します。
IT学習は 資料を見て学習 → 練習作品の作成 の繰り返しですので、是非この情報を参考に勉強方法を考えてみてください。

WEBデザイナー

  • jQuery
  • Adobeソフト(Photoshop、Illustrator、XDなど)
  • CSS設計

技術について
jQueryは、もう先進的な技術とは呼べませんが、デザインを重視する作品では、まだまだ現役で採用されることが多いです。
「プログラミングはできなくても、jQueryくらいは…」と求めているエンジニアは多いかとおもうので、需要アップのために積極的に習得しましょう。(jQueryは、JavaScriptを使った技術なので、JavaScriptの基礎もやることになると思います。)
また、他のエンジニアと差別化するためにも、AdobeとCSSの使いこなしは重要です。
Adobeでポンポンと質の高いデザインを提案し、レベルの高いCSS(SassやマテリアルUIなど)で実力を見せつけましょう。
「CSSわからん」というエンジニアは多いので、たくさん勉強して積極的にマウント取りに行きましょう。←
また、個人客向けに手早く稼いでいく事が理想なら、WordPressやBootstrapを習得してもよいと思います。

練習課題
まずは、JavaScriptの基礎と、jQueryにチャレンジしてみましょう。
その過程で、LPやポートフォリオなど作ってみて、きちんと肌感を掴んでみてください。
(HTMLとCSSだけで出来ること・出来ないことを、きちんと学びながら進められたらいいですね。)

最終的に、最先端のリッチな見た目のWEBサイトだって作れるようになります。
InstagramやAppleのホームページなんて模写出来るようになったら、もうそれはカリスマデザイナーですよ!

デザイン業界全般に言えることですが、自分を売り込むときに、とにかく多くのサンプルを提出することは大事なことです。
ジャンルに幅をもたせて「こんなものも、あんなものも、あらゆるデザインを作れる」デザイナーになるか、
それとも1つの方向性を極めて「こういうデザインなら、この人に頼むのが一番」そう思われるようなデザイナーを目指すか、
それは人それぞれかと思いますが、ひたすらたくさんの作品を見せつけて、自分の実力を証明していってください。

バックエンドエンジニア

  • サーバーサイド言語(PHP、Rubyなど)
  • データベース(MySQLなど)
  • Linuxコマンド
  • Git

技術について
フロントエンドがリッチになったと言えど、やはり手堅いシステムを作るにはサーバーサイドが一番です。
需要がとても多いPHP(フレームワークとしてCakePHPやLaravelなど)を身につけるもよし、
キラキラ&ドヤドヤな感じがするRuby(フレームワークとしてRuby on Rails)を身に着けて、キラキラスタートアップで働くもよし。

サーバーサイドで活躍するためには、LinuxコマンドやSQLは必須です。
また、作るものに応じて、HTTP通信や、セキュリティ関連の知識など、必要になってくる知識もたくさんありますが、
その分作れるようになるものもたくさんあります。
ソースコード管理のためにGitもできれば習得しましょう。(CUIで十分という会社もあります。)

ただ、やはりHTMLとCSSの次にプログラミングを始める第一歩として、最初はJavaScriptを学ぶというのもアリだと思います。
RubyもPHPもひとクセあるみたいなので。

練習課題
まずは、JavaScriptの基礎と、PHPにチャレンジしてみましょう。
その過程で、掲示板やチャット(非リアルタイムでOK)など作ってみて、きちんと肌感を掴んでみてください。

最終的に、フレームワークを使用したWEBサービスだって作れるようになります。
セッションを活用したログイン機能や、データベースの構築や、セキュア(安全)なデータのやり取り、
HTTP通信をフル活用したシステムが作れるようになれれば、どこに行ってもおまんまを食べていけるでしょう。
きちんとセキュアなサービスが作れたら、すごく自信が付きますよ。

フロントエンドエンジニア

  • JavaScript(jQuery、React、Vue.jsなど)
  • Linuxコマンド
  • Git

技術について
フロントエンドというのは、つまるところJavaScriptのことです。
ライブラリを使わないバニラJavaScriptで色々かけるようになると、あらゆる場面で困らなくなります。
また、今まさに来ている技術としてReactやVue.jsなどの、モダンなJavaScriptライブラリがありますので、
そのあたりも含めてきちんと勉強していると「おっ、こいつ、ちゃんとしとるな」と評価してもらえるかと思います。

サーバーや、PaaSやSaaSなどと呼ばれるサービスを使って作品をアップロードしていく必要があるため、
バックエンドエンジニアと同じく、Linuxコマンドの習得は必須です。
また、ソースコード管理のためにGitもできれば習得しましょう。(CUIで十分という会社もあります。)

練習課題
まずは、JavaScriptをしっかりと習得してみましょう。
その過程で、Todoリストなど作ってみて、きちんと肌感を掴んでみてください。(jQueryなどのライブラリを使ってもOK)

最終的に、SPA(シングルページアプリ)だって作れるようになります。
今までのWEBサービスのような、ページの遷移を利用するシステムではなく、
JavaScriptで必要な部分だけHTTP通信を行うAjaxや、
HTMLのパーツだけ書き換えていくDOM操作、いろんな企業が提供してくれているAPIなどを活用しながら、
さながらスマホアプリにしか見えないような、リッチなWEBアプリを作り上げてください!

Rで量的データの概観を見る( Discirbe() )---初心者向け---

$
0
0
tags: rBasicLearning

Discribe()の使い方

使用するデータ

今回は, データとしてirisを使う.

library(datasets)iris

Discribe()を使う場合

量的データの概観の詳細を見たい時に使う.

Discribe()

以下のように, 量的データの, 母数・平均・標準偏差・メジアン・最大値・最小値・範囲・歪度・尖度・標準誤差が見れる.

>describe(iris$Sepal.Length)# One quantitative variablevarsnmeansdmediantrimmedmadminmaxrangeskewkurtosisseX111505.840.835.85.811.044.37.93.60.31-0.610.07

また, 以下のように全体を見ることもできる.
*がついているのは, 質的データ.

>describe(iris)# Entire data framevarsnmeansdmediantrimmedmadminmaxrangeskewkurtosisseSepal.Length11505.840.835.805.811.044.37.93.60.31-0.610.07Sepal.Width21503.060.443.003.040.442.04.42.40.310.140.04Petal.Length31503.761.774.353.761.851.06.95.9-0.27-1.420.14Petal.Width41501.200.761.301.181.040.12.52.4-0.10-1.360.06Species*51502.000.822.002.001.481.03.02.00.00-1.520.07

【使用技術編】未経験からWeb系自社開発企業に転職するためにどのようなポートフォリオを作ったか。

$
0
0

こんにちは。
先日30歳未経験から独学4ヶ月でバックエンドエンジニアとしてWeb系自社開発企業へ転職するまでのロードマップという記事を投稿しました。

そちらではポートフォリオの内容について詳しくは触れなかったので、こちらでお話しできたらなと思います。

私がどんなポートフォリオで就活に臨んだか
という内容になります。
前回の記事と被る部分も多くありますがご容赦くださいまし。

前置き

本記事はプログラミング初心者を対象にしたものなので、理解しやすいように噛み砕いて文章を作成しています。
多少語弊のある内容もあるため現役プログラマーの方の閲覧時は生暖かい目で見てください(笑)

前提

私が作成したのは規模の小さい自社開発のベンチャー企業に就職するためのポートフォリオです。
評価の仕方は「会社の規模・形態によって変わる」というのが私の見解。
入りたい会社によって見るポイントは変わり、それに合わせた成果物を提出しないと高い評価は得られないと思います。

たとえばフロント・バック・インフラの各分野でそれぞれ部署から分かれているような大きめの会社の場合、自分がジョインする部署以外の技術は選考でスルーされることもあります。
だったら一つの分野に特化したポートフォリオのほうが良い場合もあるということですね。

もちろん全部できればいいんですが、時間は限られているのでしっかり見定めて上手に勉強しましょう!

ポートフォリオとはなんのために作るのか。

これを意識していないと、成果物のアピールポイントがブレてしまうのでしっかり固めておきましょう。
私が特に意識したことは以下2点です。
- 自身の自走力の証明
- 自分がどの分野に興味があるのか

重要なのは現時点での技術力の証明ではないと考えています。
多くの企業は未経験者に高い技術力自体を求めているわけではなく、その技術を自力で学んだ自走力を求めているのではないかという考えですね!
入社してからちゃんと会社の使用技術にキャッチアップし成長してくれるかどうかを見ているのでは無いだろうか?と思い取り組んでいました。

どんなポートフォリオを作ったか

  • 基本的な機能を備えた記事投稿サービス
  • Youtubeの動画を埋め込める仕様にした
  • 本番環境はAWS
  • 開発環境にDockerを導入
  • CIツールにCircleCIを導入
  • 自分なりに見やすいUIを意識した
  • 誰でもすぐに使える仕様にした

Ruby on Railsを使用し基本的な機能を搭載

私のポートフォリオに搭載した機能は以下です。

  • 記事投稿・編集・削除
  • 記事検索
  • ユーザー登録・編集・削除
  • 画像投稿
  • Youtube動画埋め込み機能
  • ページネーション機能

ページネーションと検索機能、動画埋め込み機能の3つ以外は全てProgateで学べる技術です。
単体テストのためにRspecも導入しました。

Railsのバージョンは5系がいいかなと思います。

最新のバージョンは6系ですが、リリースされて間もない(2020年2月現在)ので選考を受ける企業とのマッチ度が低いかなと。
今はRails4系か5系を使っている企業が多いという話を先輩から聞きました。
またリリース間もないということでネット上に技術的な情報が少なく、英語の記事や公式リファレンスを読むことになります。厳しい。

MySQL8は使わない方が良いと思います

MySQL8からは認証プラグインというものが変わっているのが初学者にとっては厄介・・・。
僕はいちいちそれを過去の認証プラグインに変える動作をいれないとエラーが出る〜なんて時期がありました。

もともとMySQL8を前提にしたDBの学習をしていれば良いのですが、ネット上に出回っている情報が少なめなのでMySQL5.7とかの方がエラーにぶつかったとき対処しやすいです。
※DB関連のエラーは本番環境やDocker、CircleCIなど環境構築の時に発生しやすく、そういったインフラ部分の学習の妨げになりかねないです。

最初の開発環境はAWS cloud9を使うのがおすすめ。

自分のパソコン上で開発環境を構築しようとすると、最初は「何をインストールすればええのん?」ということになります。(そもそも当時は「開発環境構築ってなんだ?」って思ってましたw)
Progateなどの学習サイトを終えてポートフォリオ作るよ!ってなったときにここでつまづくと一気にモチベーションが下がって挫けそうになります!
しかも、後々Dockerを学習すれば環境構築はDockerで行うので、今骨を折って頑張る部分ではないと思います。
AWS https://aws.amazon.com/jp/
アカウントを作った後にコンソールからCloud9に飛び、好みの開発環境を選ぶだけです。

ここまでで思ったことは以下

  • ユーザー登録機能にはGemの"device"を使えばよかった。
  • Twitter認証ログインやAPIを使用した機能を導入すればよかった。

特に2つ目のAPIについてです。
昨今はAPIの使用が当たり前になっているので、APIの仕組みや必須となってくるHTTP通信について学んだ方が苦労は少なかったと思います。

以前書いたようにポートフォリオはチュートリアルに毛が生えた程度のものでは高い評価が得られません。
その辺りは話題のテック系YouTuberさんもわかりやすく解説してくださっている動画があるのでぜひ調べてみてください(許可を得てないのでリンクはしてません)

そこでどのように+αのアピールポイントをつけるのか。
バックエンドの領域における+αという形でいうと、API導入は良いチョイスだと思います。
学習ハードルが低く目につきやすい機能としてTwitte認証ログインもオススメです。

え?機能少なくない!?と感じたかと思います。

私は+αのアピールポイントをバックエンドの領域では作りませんでした。
もちろん作りたかったのですが、仕事も忙しく作業の時間は限られていたからです。

私はバックエンドだけでなくインフラの領域にも興味を持っていたため、そちらで+αのアピールポイントを作りました。

ポイント1:本番環境はAWSへデプロイ

これは必須だと思っています。
導入の難易度が低いことからHerokuを使用する人も多いと聞きますが、それは実践を全く意識していないと自ら言っているも同然というのが個人的な意見。

最初はElastic Beanstalk を使用するのがベストでしょう!

インフラの領域へ足を踏み入れることになるため学習ハードルは高いです。
最初は多くの作業をAWSが自動で行ってくれるElastic Beanstalk(EB)でデプロイを行ってみて、それからVPCやEC2、RDSなどの勉強をするとモチベーションも保てて良いと思います!(๑•̀д•́๑)
EBではGUI(コマンドラインではなくてブラウザ上)でポチポチ選択して環境が作れますし、DBもポチポチして勝手に作ってくれます。
デプロイもGitHubからZipでDLしてポイってするだけなので簡単。初心者には絶対おすすめです。

ポイント2:開発環境にDockerを導入

注目度が高く、今では当たり前に現場で使われている技術のため導入しました。
個人的にはかなり重要なポイントだと思います。

なぜならこれも実践を意識していることをアピールできるからです。
※詳しくは他に解説している記事やサイトを参照していただければと思いますが、要は「アプリケーションが開発環境だと動くのに本番環境だと動かない」という事態を避けたり、チーム開発をしやすくする事もできるツールだと思っていただければ良いかと。

Webサーバー用とDB用のコンテナ2つ作ればおっけーです。

この時にRailsのdatabase.ymlとdocker-compose.ymlの整合性や環境変数やらでずいぶん苦心しましたが、Web上に落ちているテンプレートをカスタマイズする方法でクリアしました。

あと、入社してすぐに使いましたw

ポイント3:自動テストのためCircleCI導入

「未経験者でCircleCI使ってる人あまりいない」と現役エンジニアの方に言われました。
みなさんバックエンドのブラッシュアップに時間を使って、自動テストまで手を伸ばす人はいないようですね。

ただしこれについては、費やした時間に対してのリターンは少なかったと感じました。
というのも、自動テストというのは全くパッと見に影響しないものです。
未経験者のポートフォリオというものはあまりじっくり見てもらうことができないため、選考・面談の際には話題にすらあがらなかった・・・・。
(見てくれる人が採用担当だったら高い評価をえられたかも?)

バックエンドの領域で十分な機能を実装したうえで、時間に余裕があったら導入するくらいが良いのかなと。
おそらく多くのAPIを使用する方が評価が高まるだろうと思います。

私がポートフォリオに盛り込んだ強みは以上です。

ポートフォリオ作成にあたり気をつけた方がいいなと思ったこと

UI/UXの整備

「ユーザーインターフェイス/ユーザーエクスペリエンス」の略
見た目と、それによる使いやすさですね。
例えばどこにログインボタンがあるか分からなかったら使いにくいですよね・・・。そういった成果物は評価を得づらいということです。

ユーザー(ここで言う企業の選考担当者・評価者)がパッとみてどう使えば良いかわかりやすいかと言うのはWebサービスではとても重要です。

何人か未経験者のポートフォリオを拝見しましたが、これが整っていない方のモノは正直あまり使ってみようとは思えませんでした・・・。
私がそう思うということは、ユーザーはよりいっそう使用する気が失せるということ。つまり採用担当者に自分の頑張りを見てもらうことすらできなくなるわけです。

スクリーンショット 2020-01-28 3.01.57.png

「ログインしなければ使えない」は論外

採用担当者がじっくりとポートフォリオを見てくれたことはほとんどなかったです。

そんななかで″自分のメールアドレスを打ち込みパスワードを決めて、その後ログインして使う″という動作をさせるというのは、そもそもサービスの設計としてユーザー側への配慮が足りていないと言わざるを得ません。
UI/UXでも同じことが言えますが、「どのようにユーザーに使ってもらうか」を考えながら作るべきだなと思いました。

記事投稿サービスであれば、記事を見るのはログイン不要。
投稿にはログイン要。
とすれば良いと思います。

「かんたんログイン」のようにワンタッチで仮ログインができる機能があったら、「ユーザーへ配慮した設計ができる」という点でも採用者からの評価も良いのではないでしょうか!
スクリーンショット 2020-01-28 3.07.19.png
ログアウト状態でも記事は見れます。

セキュリティへの意識を見せる

昨今は社会的に情報セキュリティへの意識が高まっています。
企業の意識が高い部分に合わせてポートフォリオを作成することはとても重要だと思いました。
例えばパスワード入力を伏せ字にするだけでも構いません。
できればSSL化して通信方法をhttpsにするとさらに良いですが、そこは自分の余力と相談で良いかなと思います。

ここまでを踏まえたうえで、使用技術がマッチした会社の選考でしっかりとアピールできれば内定に近づけると思います。

ただし!

個人的に最重要だと思うのは人間性やコミュ力だというのが個人的な感想。

ここまで読めばわかるように、実際に私が作ったポートフォリオは「ハイレベル」というところまでは達していないと思います。

(自画自賛みたいになってしまいますが)内定をいただけた会社もそうでなかった会社でも、採用担当者の方からは人間性を評価されてました。

そういった就活に関わる部分については、また記事にしたいなーとおもってます

前回の記事にいいね・ストックしてくださった皆さんありがとうございます😊


プログラミング用語の読み方「HTML / CSS」

$
0
0

プログラミング用語の読み方「HTML / CSS」

英語表記の用語達

プログラミングを始めたばかりの自分は覚えなければいけないことが毎日大量にふってきます。
おそらく、かのムスカ大佐であれば
「情報量がゴミのようだ」
そう例えるほどだと思います。

にも関わらず

英語が全くな私は覚えなければいけない用語の読み方が分からない。
そのためスペルで覚えようとして効率が本当に悪い。
しかも、人に説明しようにも自分だけ、スペルを1文字づつ伝えるという手段しかない。

ということで

英語で表記された各用語をカタカナで表現し、まとめました。

Before アフター

Beforeアフター
heightハイト
widthウィズ、ウィトゥス
justifyジャスティファイ
marginマージン
paddingパディング
alignアライン
calcキャルク、キャルキュ
requiredリクワイヤード
opacityオパシティ
radiusレイディアス(ラディウス)
absoluteアブソリュート
relativeレラティブ

初投稿

$
0
0

はじめに

初投稿です。
IT業界に進みたいと思っている、へっぽこ文系(元経営と現法学)大学生です。

先日、某企業の採用を(たぶん)アウトプットをしてなかったことで門前払いを食らったので、サボりがちでへっぽこ記憶力の自分に対しての備忘録と戒めを兼ねて、少しづつ学んだことをアウトプットをしていこうと思うのでよろしくお願いします。

大学入ってからプログラミングをやり始めたのですが、ほぼ独学なので技術力は低く、今まで誰かに見てもらうことを想定してコードを書いてなかったので見づらかったりすると思いますが、生暖かい目で見守っていただけると幸いです。

プログラミングを初めたきっかけ

プログラミングを初めたきっかけは、
・ラズパイをつかって初めてLチカさせてたときにモノづくり(と言って良いのかわからないけど)の楽しさを知った
・手に職をつけたかった
・元々、PCをいじることが好きだったのでPCを使って何かをしたかった
とかなりありきたりな理由です。

やっていること

入り口が電子工作だったので主に電子工作についてのプログラミングしていましたが、最近はandroidアプリやwebアプリケーションを作ろうと勉強しています。

環境

OS:ubuntu18.04(win10が飛んで新しくライセンス買うお金がなかったので…)
エディタ:VScode,vim(苦手だけど頑張る)

誰でも簡単にラインで自然言語処理をできるようにしてみた

$
0
0

どゆこと?

投稿した文章に対して、11種類の自然言語処理を行ってくれるLINE Botです。
友達追加して解析したい文を投げる(&解析方法を選ぶ)だけで解析結果を見やすい形で返してくれます。

>>>
qiita_upload.gif
>>>

ひとまず試してみたい方はこちら(友達追加用QRコード)→
189tfayy.png

なおBot名の提案大募集中です。
(仮で付けたら一週間名称変更できませんでした...)

使い方

日本語で始まる文章を投げて、
pr1.jpg

解析方法*番号を半角数字で入力するだけ!
pr2.jpg

解析結果が見やすい&読みやすい形で返ってきます。
pr3.jpg

*)解析方法は
1 = 構文解析
2 = 固有表現抽出
3 = キーワード抽出
4 = 照応解析
5 = 類似度算出
6 = 文タイプ判定
7 = ユーザ属性推定
8 = 言い淀み除去
9 = 音声認識誤り検知
10 = 感情分析
11 = 要約
11種類から選択できます。

使ってみた結果

構文解析

投入した文章

このももとあのももはももたろうのももです。すももももももももたろうのなかまのももです。

結果
pr1.jpg

解析結果全文

<構文解析>
結果は
「表記」
(カナ読み / lemma / 品詞 / 副品詞)
の形で出力されます!

この
(コノ / この / 連体詞 / )

もも
(モモ / 桃 / 名詞 / )

(ト / と / 格助詞 / 連用)

あの
(アノ / あの / 連体詞 / )

もも
(モモ / 桃 / 名詞 / )

(ハ / は / 連用助詞 / )

ももたろう
(モモタロウ / 桃太郎 / 名詞 / )

(ノ / の / 格助詞 / 連体)

もも
(モモ / 桃 / 名詞 / )
です
(デス / です / 判定詞 / 終止)

( / 。 / 句点 / )

すもも
(スモモ / 李 / 名詞 / )

(モ / も / 連用助詞 / )

もも
(モモ / 桃 / 名詞 / )

(モ / も / 連用助詞 / )

ももたろう
(モモタロウ / 桃太郎 / 名詞 / )

(ノ / の / 格助詞 / 連体)

なかま
(ナカマ / 仲間 / 名詞 / )

(ノ / の / 格助詞 / 連体)

もも
(モモ / 桃 / 名詞 / )
です
(デス / です / 判定詞 / 終止)

( / 。 / 句点 / )

ちゃんと認識できてますね!

固有表現抽出

文章:
日本国憲法から

朕は、日本国民の総意に基いて、新日本建設の礎が、定まるに至つたことを、深くよろこび、枢密顧問の諮詢及び帝国憲法第七十三条による帝国議会の議決を経た帝国憲法の改正を裁可し、ここにこれを公布せしめる。

結果:
2.jpg

解析結果全文

<固有表現抽出>
結果は
「表記」
(標準表記 / 固有表現クラス / 拡張固有表現クラス)
の形で出力されます!

定まる
(定まる / PSN / / )

枢密顧問の諮詢及び帝国憲法第七十三条
(枢密顧問の諮詢及び帝国憲法第七十三条 / ART / / )

帝国議会の議決を経た帝国憲法
(帝国議会の議決を経た帝国憲法 / ART / / )

日本国民
(日本国民 / ORG / Ethnic_Group / )

新日本建設
(新日本建設 / ORG / Company / )

「新日本建設(新日本建設 / ORG / Company / )」
その発想はなかった...!

キーワード抽出

文章(引用元:COTOHA API):

全部で14の自然言語処理・音声処理APIをご提供

言語のなかでも特にむずかしいとされる日本語の高精度な解析が可能なCOTOHA API。
テキスト解析や対話エンジン(テキスト/音声)などにご利用いただけます。

結果:
3.jpg

「COTOHA API」も抽出できています!

照応解析

文章:

山田君は山田研究所の所員です。彼は自然言語解析をテーマとしていますが、それは彼らの研究のほんの一部にすぎません。

結果:
4.jpg

けっこういい感じ!

(意味的)類似度判定

日本と韓国の憲法(の中身)が似ていると聞いたことがあるので、
じゃあ前文は?
ってことでやってみました。

文章:

日本国憲法前文

日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたって自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないようにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。
日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。
われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。
日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。

大韓民国憲法前文

悠久な歴史と伝統に輝く我々大韓国民は、3・1運動で建立された大韓民国臨時政府の法統と、不義に抗拒した4・19民主理念を継承し、祖国の民主改革と平和的統一の使命に立脚して、正義・人道と同胞愛で民族の団結を強固にし、全ての社会的弊習と不義を打破し、自律と調和を土台に自由民主的基本秩序をより確固にし、政治・経済・社会・文化のすべての領域において各人の機会を均等にし、能力を最高度に発揮してもらい、自由と権利に拠る責任と義務を完遂するようにし、(国)内では国民生活の均等な向上を期し、外(交)では恒久的な世界平和と人類共栄に貢献することで我々と我々の子孫の安全と自由と幸福を永遠に確保することを確認しつつ、1948年7月12日に制定され8次にわたり改正された憲法を再度国会の議決を経って国民投票によって改正する。

結果:
5.jpg

>>>99.8%<<<

マジ?

文タイプ判定

文章(引用元:JR東日本 新幹線の運行状況):

北陸新幹線は、台風19号の影響で、暫定ダイヤで運転しています。時刻等の詳細はJR東日本ホームページをご確認下さい。

結果:
6.jpg

文章(叙述、質問、命令)の中では「命令」、
発話行為19種の中で「directive (=指示)」
とかなり正確!

ユーザー属性推定

文章:

古池や蛙飛びこむ水の音

松尾芭蕉の属性は...

7.jpg

うーん?
どうやって推定してるんですかね?

言い淀み除去

文章:

あなたは、あのー、お母様と、お、お父様と、えーっと妹さんと、その、こちらに、えーっと、いらしたんですね

結果:
8.jpg

わりといい感じ?

音声認識誤り検知

文章:
もう一回日本国憲法から

朕は、日本国民の総意に基いて、新日本建設の礎が、定まるに至つたことを、深くよろこび、枢密顧問の諮詢及び帝国憲法第七十三条による帝国議会の議決を経た帝国憲法の快晴を裁可し、ここにこれを公布せしめる。

結果:
9.jpg
修正候補に関しては文内容との整合性を考慮していないっぽい。

感情分析

文章:

嬉しそうに見えてたけど、実は悲しかったらしい。

結果:
10.jpg

Positive wordとNegative word1個ずつならNeutralになるかと思ったけど違った。

要約

ちょうど近所のスーパーからLINEで広告が送られてきたので...
文章:

こんにちは(わーい)

明日 2/12(水)~2/15(土)
全国お取り寄せグルメを販売いたします!

今回は北海道の定番商品(きらきら)
「オタル製菓」の大鵬をご用意しました(ぴかっ)
米ぬか油でカラッと揚げた生地に、香り豊かな本醸造醤油(保存料無添加)とビート糖をブレンドした独自の甘辛い糖蜜を掛けたスナック菓子です。

是非、ご賞味ください。

ご来店お待ちしています(きゅん)

結果:
11.jpg

>>>>ご来店お待ちしています(きゅん)。<<<<

確かに重要...!

使ったもの

・GAS (Google App Script)
・LINE API
COTOHA API

コード(後日公開予定)

公開するには汚すぎたので、綺麗にしてからあげます...

参考

スプレッドシート内を検索
curl→gsに変換
自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた

また以下のコードどこから引用したのかわからなくなってしまったので、お心当たりある方は大変恐縮ですが該当コードが書かれている記事のURLを添えてコメントお願いします。
すぐに参考の方に追加させていただきます。

こんな感じのコード:

/*
LINEから送信されたデータをメイン処理する
———————————–*/functiondoPost(e){/* レスポンスを取得 */constresponseLine=e.postData.getDataAsString();/* JSON形式に変換する */constresponseLineJson=JSON.parse(responseLine).events[0];/* イベントへの応答に使用するトークンを取得 */constreplyToken=responseLineJson.replyToken;varjson=JSON.parse(e.postData.contents);//user_idの取得、var宣言をしなければグローバル化LINE_user_id=json.events[0].source.userId;/*– メッセージイベントの場合 ———————–*/if(responseLineJson.type=='message'){messageController(responseLineJson,replyToken);}}/*
メッセージイベントの処理
———————————–*/functionmessageController(events,replyToken){constmessage=events.message;constinput=message.text;varcontent=processing(input);varLineMessageObject=[{'type':'text','text':content}];replyLine(LineMessageObject,replyToken);}/*
LINEに返信する処理
———————————–*/functionreplyLine(LineMessageObject,replyToken){constreplyHeaders={'Content-Type':'application/json','Authorization':'Bearer '+LINE_TOKEN};constreplyBody={'replyToken':replyToken,'messages':LineMessageObject};constreplyOptions={'method':'POST','headers':replyHeaders,'payload':JSON.stringify(replyBody)};UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply',replyOptions);}

非エンジニアのためのPython入門

$
0
0

世の中の流行を追う〜プログラミングについて〜

昨今、言わなくてもわかるくらいに「プログラミング」というものが注目されだした。ちょっと前まで(2010年〜2015年)はプログラミングといえば理系のエンジニアが取り組むもの、パソコンの専門家が使うような、いわゆる非理数系の方々には馴染みのないものだった。
ところが、世の中を見渡せばGAFAに代表されるようなIT企業が世界の時価総額ランキングトップ10に名を連ねているし、アメリカもアジアもIT企業が社会に与える影響が日々大きくなっている。テクノロジーを持つ会社が強いという事実は、今更論じるまでもないと思う。
では、IT関連以外のメーカーや商社、農業や物流などの分野をメインとしている会社においてIT系の知識が不要かというと、全然そんなことはない。むしろ生き残りたかったらITの知識は絶対になくてはならない。
今から30年近く前には確かにインターネットは普及していなかったし、人々の生き方が全然違ったから技術的なことは専門家がやっていればそれでよかったのかもしれない。だが、時代が流れ携帯電話もインターネットも普及し、家から一歩も出ずに衣食住のすべてを手に入れることができる世となった。
AndroidかAppleのスマホを使って、Googleで調べて、Amazonで生活に必要なものを買い、FacebookやInstagramで友達の近況を知り、Youtubeで時間を潰す、または自分から発信してフォロワーを集め、Paypalなんかで送金でもしてもらえばもうまったく外に出る必要もない。
そのくらい、IT技術の発展で生活スタイルは変わってしまった(上記の例は極端だけど)IT人材はなぜ必要かというと、上記の生活スタイルに寄与できる存在だからだと思う。技術を持った人材はこれからの世の中も市場価値が高く、必要とされ続ける存在だ。では具体的にその技術がなんなのかというと、プログラミング技術ということになる。コードを書くことができ、アルゴリズムを組み立て、自分で考えたプログラムを実装することができ、業務に技術的な改善と革新をもたらす可能性のあるスキルだということだけでも覚えてもらいたい。
因みにIT技術に優れているというくくりで俗に言う「Excelマスター」が巷にはいるが、Excelができる=IT人材である、という認識は持たない方がいいと思う。関数の組み合わせや表計算の工夫でそれなりに便利な使い方はできるが、やはりExcel単体では限界がある。これは、僕がPythonを学ぶきっかけにもなったことなので、是非似たような思いを抱いている人には自分ごととして捉えてもらえるとありがたい。

なぜCでもJavaでもなくPythonなのか

よく、プログラミングを始める際に「どの言語で始めようかな?」と迷う人も多いと思う。
事実、僕がVBAを一通り使えるようになって、それでもやりたいことには足りないから他の言語を学ばないとなぁと思った時、どの言語を選べばいいか結構迷った。
Ruby、PHP、Java、C(C++)、Perl…世の中を見渡すとプログラミング言語というのは多く、中にはCOBOLやBASIC、FORTRANのようなレガシー的な言語まで存在する。因みに度々話題になるメガバンクの中の青い銀行はバリバリCOBOLが今も使われているという噂だが、実際のところは果たして…。
とにかく、どの言語を選ぶかというのはその後のプログラミング人生を左右すると言っても過言ではない。というのも、書き方の癖やできること、直感的に好きか嫌いかまでに影響してくるので、そういう意味では一番最初に付き合った恋人に影響されてしまうのによく似てる。変人と付き合ったらなんとなくその後も変人が好きになるとか、なんとなく元カレ・カノと同じタイプを選んでしまうとか…そう考えるとちょっと選ぶ大切さがわかってもらえそうな気がする。

個人的な話をすると、一番最初に触れたプログラミング言語はJavaで、大学の選択授業の中で学ぶものだったが、これは非常によくない体験だった。というのも、講師の人がこちらがわかっていようがいまいが、カリキュラム通りに進めるので「え、なんでこう記述するとこう動くの?」みたいな疑問が一切解決されないまま先に進んでしまう。どこか中学や高校で数学の公式が「なぜこうなるのか」というのがわからないまま進むのに似ている。
おかげで僕は、すっかり授業についていけずその授業は放棄したし、初歩的なことも理解できないのではプログラミングは自分には向いてなくて無理なんだ、と自らの可能性を閉ざした苦い経験がある。そういう経験をこれを読んでいる人にはしてほしくないので、おすすめしたいのが「Python」という言語だ。
このサイトではGoogleでチュートリアルが調べられた数を元にプログラミング言語をランキングにしているのだが、ここではPythonが一番高く出ている。2番目がJavaで、3番目がJavascriptになっているが、肌感覚的には確かにそんなもんか、という気がする。
また、収入面やオファーの多さで言ってもPythonは下図の通りかなりの数値を誇っており、世の中がデータサイエンスに向かっていることを証明している。
image.png
これだけ人気があり、収入面も期待できる言語のPythonだが、実はJavaやCに比べると学習コストがとても低く、非プログラマーでも簡単に書けるという良さが個人的に最もウリである。上記の通り、Javaでプログラミングから脱落してしまった自分にとって、Pythonはサクサク覚えられ、プログラミングという世界が決して遠いものではないという意識にさせてくれた。
これが、僕がPythonをおすすめしたい理由のはじまりだ。

こんなに簡単でいいんですかー!?Pythonの書き方について

「そうは言ってもPythonってプログラミングだから覚えること多いんでしょ?」と思う人もまだまだいるかもしれない。確かにプログラミング言語である以上覚えることは一定数あるが、それでも始めるのには超楽なのがPythonだ。
まず、公式サイトでPythonをダウンロードしてみて欲しい。
https://www.python.jp/
上記サイトで「ダウンロード」のPythonを3.7.2をクリックして、インストールする。ここらへんの詳しい解説は是非「Python インストール方法」なんかでググって欲しい。
ともかく、Pythonがインストールできたら次のプログラムを起動させてほしい

hello.py
print('Hello World!')

はい、これですでにもう出力結果は「Hello World!」である。Pythonは究極的な速さでHello Worldを出力できる強みがある。
因みに多くのプログラミング言語では何かしらの出力や変数に「型付け」というものが必要になるのだが、Pythonのいいところは勝手に型付けをしてくれる(良くも悪くも)
なぜ良くも悪くもか、というと、Pythonで以下のコードを書いたとしよう。

sample.py
a=2b='hello'print(a)print(b)#2
#hello

aには2という数字を代入し、bにはhelloという文字列を代入している。
これ自体はなんの間違いでもないので、それぞれをprint文で出力するとちゃんと変数に入れたものを出力してくれる。そして変数の中身は数値型ですね(int型)、文字列型ですね(str型)と判断してくれるので、いちいち他の言語のように宣言をする必要がないのだが、これが原因であとからバグが起きたりすることもあるので、それだけは段々覚えながら「あ、Pythonってこうい弱点もあるんだな」と感じて欲しい。
とにかくこうした点から非プログラマーでもPythonはいきなりプログラミングチックなことができるので非常に楽しく、「俺SUGEEEE」みたいな万能感が得られるためおすすめである。
ちなみにプログラミングの楽しさが一番わかるコードとして、僕は以下のようなものがあった。

for_py
foriinrange(11):print(i)#1
#2
#3
#4
#5
#6
#7
#8
#9
#10

あっという間に10までの数を繰り返し表示してくれるという優れもの。
これについてはPython for文みたいな感じでググって欲しい。

Python万歳なのはわかったけど、何ができるの?

ここまでPythonがさも万能言語かのように書いてきたが、実際にPythonで何ができるかというと、以下のようなものがある。
・Web系の制作(フレームワークが揃っている)
・機械学習
・インターネットのスクレイピング(いわゆる、決まったサイトから決まった情報を定期的に拾ってくること)
・データの分析(Excelと同じ系統ですが、より数学チックに処理できます)

逆にできないこととしては
・JavascriptのようなWebサイトの動的な仕組み作り
・Javaのようにコンパイルしたらどんな環境でも動かせるプログラム

くらいかなぁ…あとは突き詰めれば色々とありますが、結構なんでもできちゃうのがPythonのいいところなんです。
一番のメリットは機械学習かな。これからの時代、データサイエンスがどうとか耳タコなくらい聞いたこともあると思うけど、そこにはPythonの存在が切っても切り離せない。もちろんRとかSPSSとかそこらへんも統計的に処理する上で出てくるんだけど、Twitterとか見てるとアメリカ含め世界の潮流はPythonで処理する流れになっているんだとか…。
今の世の中、Pythonができるだけで「すげー!採用!年収1,000万!」みたいなさすがに魔法の杖にはならないけれど、Python×何かあなたが持つ強みを組み合わせれば、大抵の職にはありつけると思う、ということだけは言っておく。
少しでもこの記事を読んで、Pythonに興味が湧き、チャレンジしてもらえたら幸いである。

FortranコードにBLASをリンクする

$
0
0

Fortranで書いたコードにBLASをリンクしたい。
前提として、fortranのコンパイラ(gfortranとか)があることを想定。念頭に置いているのは、Linux様環境。

Linuxのパッケージ管理で入れたBLASをリンク

apt-getなり、yumなり、zypperで入れたBLASをリンクする。gfortranを使っているとき、

gfortran -O3 main.f90 -lblas

これで大方通るはず。

通らない時は、BLASが置いてあるディレクトリにpathが通っていない。$ ldconfig -pとかで、一応候補にあるかどうか確認してみる。なぜだか、ライブラリのpathを知っていて、そこにはLD_LIBRARY_PATHを通していない場合は以下のようにして、リンクできる:

gfortran -O3 main.f90 -L/path/to/be/specified/ -lblas

自分でビルドしたBLASをリンク

BLAS (Basic Linear Algebra Subprograms)からコードを取ってきて自分でビルドして、リンクできる。ライブラリというよりも、分割コンパイルしたオブジェクトを自分のコードにくっつけると思った方が、感覚としては近いかも。自分が管理者ではない計算機の、どこにBLASがあるのかわからないとき、ひとまず自分でビルドしたものをリンクすれば、動作確認はできる。
例として、blas-3.8.0.tgzをダウンロードしてきたとする。

展開

ダウンロードしたコードを展開して、適当なディレクトリ(例えば'/home/user/sources/`とか)にうつす。

tar-zxvf blas-3.8.0.tgz
mv ./BLAS-3.8.0 /home/user/sources/

ビルド

展開したディレクトリに移って、

make 

でおしまい。Makefilemake.incをインクルードしていて、コンパイルのオプションとか出来たオブジェクトの名前とかを変えられる。デフォルトのままmakeすると静的ライブラリblas_LINUX.aが出来上がる。

所望の場所に配置

自分で使う事を念頭に、管理者権限の必要のない場所に置く。例えば/home/user/opt/BLAS-3.8.0/libを作って、その中に置く。

マイBLASをリンク

gfortran -O3 main.f90 /home/user/opt/BLAS-3.8.0/lib/blas_LINUX.a

でコンパイルすると、晴れてマイBLASがリンクできる。

二つの速度を比較してみよう

(書きかけ)

使うコード

main.f90
ProgramBLAS_checkImplicitNoneInteger(4),Parameter::N=1000,Niter=10Integer(4)::i,j,k,lInteger(4)::iterReal(8)::A(N,N),B(N,N),C(N,N)Real(8)::ts,tePrint*,'Total operations (Products just counted) ;',dble(2*N**3)/1.0e9,'GFLOPs'!InitializationC=0.d0CallRandom_Number(A)CallRandom_Number(B)A=A-0.5d0B=B-0.5d0!Hand-writing MM productCallCpu_Time(ts)Doiter=1,NiterC=0.d0Doi=1,NDoj=1,NDok=1,NC(i,j)=C(i,j)+A(i,k)*B(k,j)EndDoEndDoEndDoC=2.0d0*CEndDoCallCpu_Time(te)Print*,"Hand-writting MM product"Print*,'Elapse time =',(te-ts)/dble(Niter),' sec'Print*,dble(2*N**3)/(te-ts)*dble(Niter)/1.0d9,' GFLOPs/s'!BLASC=0.d0CallCpu_Time(ts)Doiter=1,NiterCallDGEMM('N','N',N,N,N,2.0d0,A,N,B,N,0.d0,C,N)EndDoCallCpu_Time(te)Print*,"BLAS"Print*,'Elapse time =',(te-ts)/dble(Niter),' sec'Print*,dble(2*N**3)/(te-ts)*dble(Niter)/1.0d9,' GFLOPs/s'!MatmulC=0.d0CallCpu_Time(ts)Doiter=1,NiterC=2.0d0*Matmul(A,B)EndDoCallCpu_Time(te)Print*,"Matmul"Print*,'Elapse time =',(te-ts)/dble(Niter),' sec'Print*,dble(2*N**3)/(te-ts)*dble(Niter)/1.0d9,' GFLOPs/s'EndProgramBLAS_Check

出力例

 Total operations (Products just counted);   2.0000000000000000      GFLOPs
 Hand-writting MM product
 Elapse time=   1.6673765999999997       sec
   1.1994890656376012       GFLOPs/s
 BLAS
 Elapse time=  0.30331340000000007       sec
   6.5938399028859243       GFLOPs/s
 Matmul
 Elapse time=   8.7328699999999773E-002  sec
   22.901978387403052       GFLOPs/s

OpenBLAS

OpenBLAS : An optimized BLAS library
大変、速いらしい。

展開&ビルド

tar -zxvfで展開。普通にmakeでビルドが通る。数分ビルドにはかかるかも。
標準出力の内容をを見る限り、BLAS, CBLAS, LAPACK, LAPACKEがビルドされているみたい。
ビルド後にmake PREFIX=/path/to/be/installed installで、ライブラリ群が所望の場所にインストールされる。

リンクは

gfortran -O3 main.f90 -L/home/user/opt/OpenBLAS-0.3.7/lib -lopenblas

gfortran -O3 main.f90 /home/user/opt/OpenBLAS-0.3.7/lib/libopenblas.a -lpthread

で通る。

 トラブルシューティング

Pathの通しそびれ

./a.out: error while loading shared libraries: libopenblas.so.0: cannot open shared object file: No such file or directory

共有ライブラリなので、pathが通っていなくても、コンパイルは通る。しかし、pathが通っていないと、実行時にlibopenblas.so.0を探し出せなくてコケる。例えば、ldd ./a.outをみると

        linux-vdso.so.1 (0x00007ffd9e2d3000)
        libopenblas.so.0 => not found
        libgfortran.so.5 => /lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f75be493000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f75be2a8000)
        libquadmath.so.0 => /lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f75be25e000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f75be110000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f75be0f6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f75bed1d000)

となって、libopenblasが見つかっていないことがわかる。export LD_LIBRARY_PATH=/home/user/opt/OpenBLAS-0.3.7/lib:$LD_LIBRARY_PATHでpathを追加すると、動く。

静的ライブラリをリンクするとライブラリ不足で怒られる

誤って

gfortran -O3 main.f90 /home/user/opt/OpenBLAS-0.3.7/lib/libopenblas.a

でコンパイルすると

/usr/bin/ld: /home/shinohara/opt/OpenBLAS-0.3.7/lib/libopenblas.a(blas_server.o): in function`blas_thread_init':
blas_server.c:(.text+0x40a): undefined reference to `pthread_create'
/usr/bin/ld: /home/shinohara/opt/OpenBLAS-0.3.7/lib/libopenblas.a(blas_server.o): in function`goto_set_num_threads':
blas_server.c:(.text+0x982): undefined reference to `pthread_create'
/usr/bin/ld: /home/shinohara/opt/OpenBLAS-0.3.7/lib/libopenblas.a(blas_server.o): in function`blas_thread_shutdown_':
blas_server.c:(.text+0xbcb): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status

と出てくるので、その場しのぎでopenmpのオプションをつけて

gfortran -fopenmp-O3 main.f90 /home/user/opt/OpenBLAS-0.3.7/lib/libopenblas.a

とすると一応コンパイルは通る。ただ、a.outを実行するとSegmentation fault (core dump)で落ちる。と思っていたら、知らないうちに動いていた。(なんでだ)

足りないライブラリをリンクすればよいので、

gfortran -O3 main.f90 /home/user/opt/OpenBLAS-0.3.7/lib/libopenblas.a -lpthread

でも、可。

思いのほか遅い

OpenBLASはスレッド並列化されていて、何も指定しないとシステムの最大スレッド並列数で実行される。これで遅く見えている可能性があるので、export OMP_NUM_THREADS=1等で、適切な値にするとよい。
というか、スレッド並列だと、cpu_timeは正しく時間を計測してくれていない気がする。

ATLAS

Automatically Tuned Linear Algebra Software (ATLAS)
アーキテクチャごとに最適化したBLASをインストールできる。

展開&ビルド

Basic Steps of an ATLAS installを参考に。
tar xf atlas3.10.3.tar.bz2で展開。
出来たディレクトリATLASATLAS3.10.3に変更
このディレクトリの中にディレクトリBLDdirを作成。(ソースのあるディレクトリでconfigureしようとすると、怒られる。)
CPUのthrottlingを止めるのはだるかったので、-cripple-atlas-performanceをつけてそのまま./configure.

../configure --prefix=/home/user/opt/ATLAS3.10.3 --cripple-atlas-performance
make build #結構時間かかる
make check
make ptchek
make time
make install

historyコマンドで行番号を表示させない

Rで第一・第三四分位数を求めるテンプレート

$
0
0
tags: rBasicLearning

Rで第一・第三四分位数を求める

1. 四分位数を求めるテンプレート

四分位数を求めるテンプレートは, 以下に作りました.
宜しければ, 使ってください!

  1. データの大きさの剰余で奇数か偶数かの分岐をif文で作ります
  2. 前半のデータと後半のデータをデータの大きさの整数商で分けます(整数商にするのは, データの大きさが奇数でも偶数でも変わらないようにするためです)
  3. 前半・後半のデータを取り出します(後半のデータは後ろから数えています)
  4. 前半・後半のデータの中で中央値を取ります
data#自分が使いたいデータn<-length(data)#データの大きさif(n%%2==0){firstHalf<-n%/%2#整数商firstHalfData<-data[1:firstHalf]#前半を取り出すQ1<-median(firstHalfData)latterHalf<-n%/%2#整数商latterHalfData<-data[-1:-latterHalf]#後半を取り出す(後ろから数える)Q3<-median(latterHalfData)}else{firstHalf<-n%/%2#整数商firstHalfData<-data[1:firstHalf]#前半を取り出すQ1<-median(firstHalfData)latterHalf<-n%/%2+1#データの大きさが奇数のとき, 整数商に1加えるlatterHalfData<-data[-1:-latterHalf]#後半を取り出す(後ろから数える)Q3<-median(latterHalfData)}

箱ひげ図

箱ひげ図に関しましては, こちらをご覧ください!
RのSummary()の使い方 ---初心者向け---

2. 具体例

2.1 使うデータ

今回は, 奇数の大きさのデータ(oddData)と
偶数の大きさのデータ(evenData)を使います

oddData<-c(62,64,65,67,67,68,70,73,77,80,82)evenData<-c(18,20,21,23,23,25,27,29,30,31,32,39)

2.2 奇数データの具体例

data<-oddDatan<-length(data)if(n%%2==0){firstHalf<-n%/%2#整数商firstHalfData<-data[1:firstHalf]#前半を取り出すQ1<-median(firstHalfData)latterHalf<-n%/%2#整数商latterHalfData<-data[-1:-latterHalf]#後半を取り出す(後ろから数える)Q3<-median(latterHalfData)}else{firstHalf<-n%/%2#整数商firstHalfData<-data[1:firstHalf]#前半を取り出すQ1<-median(firstHalfData)latterHalf<-n%/%2+1#データの大きさが奇数のとき, 整数商に1加えるlatterHalfData<-data[-1:-latterHalf]#後半を取り出す(後ろから数える)Q3<-median(latterHalfData)}# データの出力Q1Q3

2.2.1 データの出力

>Q1[1]65>Q3[1]77

2.3 偶数データの具体例

data<-evenDatan<-length(data)if(n%%2==0){firstHalf<-n%/%2firstHalfData<-data[1:firstHalf]Q1<-median(firstHalfData)latterHalf<-n%/%2latterHalfData<-data[-1:-latterHalf]Q3<-median(latterHalfData)}else{irstHalf<-n%/%2firstHalfData<-data[1:firstHalf]Q1<-median(firstHalfData)latterHalf<-n%/%2+1latterHalfData<-data[-1:-latterHalf]Q3<-median(latterHalfData)}Q1Q3

2.3.1 データの出力

>Q1[1]22>Q3[1]30.5

ルーティングを設定してCSVデータをダウンロードする方法

$
0
0

目的

  • Qiitaの記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
  • 今までの実装では send_dataしか使ったことなかったのでメモ

前提条件

  • ruby 2.6.0
  • ruby 5.2.2

手順

  1. routes.rbにCSVダウンロード用のルーティングを設定する
  2. コントローラーに変数を定義、その他諸々を設定
  3. 出力データを作成(アクション名.csv.ruby)
  4. CSVダウンロードボタンを設定したいviewファイルに書く

※コード内容は適当

1. routes.rbにCSVダウンロード用のルーティングを設定する

config/routes.rb
resources:card_infosdocollectiondo# デフォルト形式をcsvに設定get:csv_download,defaults: {format: 'csv'}endend
HelperHTTP VerbPathController#Action
csv_download_card_infos_pathGET/card_infos/csv_download(.:format)card_infos#csv_download {:format=>"csv"}

2. コントローラーに変数を定義やその他諸々を設定

app/controllers/card_infos_controller.rb
classCardInfosController<ApplicationControllerdefcsv_download@cards=CardInfo.all# CSVダウンロードファイルのヘッダーを生成するcreate_csv_file_header("card_info_#{Time.zone.now.strftime('%Y%m%d')}")endend
共通化メソッド
# CSVダウンロードファイルのヘッダーを生成するdefcreate_csv_file_header(file_name)file_name=ERB::Util.url_encode(file_name)if(/MSIE/=~request.user_agent)||(/Trident/=~request.user_agent)headers['Content-Disposition']="attachment; filename=\"#{file_name}.csv\""end

3. 出力データを作成(アクション名.csv.ruby)

※viewディレクトリ配下に設置する

app/views/card_infos/csv_download.csv.ruby
require'csv'columns=%w(
  番号
  会社
  子会社
  カード種類
  カード会社
  管理区分
)# encoding等のoptionは仕様によって変えてくださいCSV.generate(encoding: Encoding::SJIS,row_sep: "\r\n",force_quotes: true)do|csv|csv<<columns@cards.each_with_indexdo|card,number|csv<<[number+1,card.company.parent_company.company_name,card.company.company_name,card.card_type.card_type_i18n,card.card_type.card_company.card_company_name,card.management_type_i18n,]endend

4. CSVダウンロードボタンを設定したいviewファイルに書く

(例)app/views/card_infos/index.html.erb
<%=link_tocsv_download_card_infos_path,class: "btn_blue btn_big csv_dl",download:"",style: "padding: 8px 25px; font-family: Arial;")do%><i><imgsrc="<%=asset_path'icon_download.svg'%>"alt="CSVダウンロード"></i>CSVダウンロード
<%end%>

📂🌲変更するファイル

.├── app
|   ├── controllers
|  |   |  
|  |   └── card_infos_controller.rb ②アクションを設定
|  |
|  |
|  |
|   └── views
|      |  
|      └── card_infos
|           |  
|           └── csv_download.csv.ruby ③出力ファイルを設定
|
|
├── config
|    |  
     └── routes.rb ①ルーティングを設定


④ViewファイルにCSVダウンロードボタンを設置

関連URL

send_dataでの日本語ファイル名文字化け対策(IE11対応)
【簡単3ステップ】RailsでCSV出力する方法

Rのパイプ演算子(%>%) --- 初心者向け ---

$
0
0
tags: rBasicLearning

パイプ演算子(%>%)

1. パイプ演算子とは

パイプ演算子の役割は, パイプ演算子の左にあるデータを
右の関数の第一引数に渡すというもの.

1-1. 前準備

パイプ演算子は, Rに元々入っているものではなくdplyrに入っているもの.
library()を用いてインストールしなくてはならない.
今回は, tidyverseで行う.

#install.packages("tidyverse")library(tidyverse)

1-2. 具体例

data<-c(1,3,5,10,11,15)#自分の使いたいデータを入れてくださいdata%>%head(3)data%>%mean()
>data%>%head(3)[1]135>data%>%mean()[1]7.5

以下のように, 複数個繋げることもできる

data%>%head(3)%>%mean()
>data%>%head(3)%>%mean()[1]3

参考 ショートカット

MACは Control + Shift + m%>%を出力できます.

Windowsは Ctrl + Shift + m%>%を出力できます.

【初心者向け】findコマンドの使い方

$
0
0

概要

いつもfindコマンドをなんとなくの理解で使っていたので、基本型からおさらいをした。

目次

  • ディレクトリ構造の確認
  • 基本形
  • オプション
  • ターミナルにエラーを表示させない方法

ディレクトリ構造の確認

ターミナル
$tree
 ./
 ├ dir1/
 | ├ file1_1.txt
 | └ file1_2.txt
 ├ dir2/
 |  ├ file2_1.txt
 |  └ file2_2.txt
 ├ dir3/
 ├ file1.txt
 ├ file2.txt
 └ file3.txt

基本形

find 探索場所のパス

出力結果は探索場所にある全てのファイル & 全てのディレクトリ

ディレクトリがある場合、その中をさらに探索していく(再帰的探索)

ターミナル
$find ..
./file2.txt
./file3.txt
./file1.txt
./dir2
./dir2/file2_2.txt
./dir2/file2_1.txt
./dir3
./dir1
./dir1/file1_2.txt
./dir1/file1_1.txt

オプション

nameオプション

find 探索場所のパス -name ファイルまたはディレクトリの名前

ターミナル
$find .-name file1_1.txt
./dir1/file1_1.txt

ファイルまたはディレクトリの名前の"一部"しか分からない、または、条件に一致するもの全てを表示したいなどといった場合には、ワイルドカードを使うことができます。
ワイルドカードは「*」で表します。

ターミナル
$find .-name"file1_*.txt"./dir1/file1_2.txt
./dir1/file1_1.txt

ファイルまたはディレクトリの名前の部分をダブルクオーテーションで囲まないとエラーになります。

ターミナル
$find .-name"file1_*.txt"zsh: no matches found: file1_*.txt

typeオプション

ファイルのみを対象にしたい場合

find 探索場所のパス -type f

ターミナル
$find .-type f
./file2.txt
./file3.txt
./file1.txt
./dir2/file2_2.txt
./dir2/file2_1.txt
./dir1/file1_2.txt

ディレクトリのみを対象にしたい場合

find 探索場所のパス -type d

ターミナル
find . -type d 
.
./dir2
./dir3
./dir1

ターミナルにエラーを表示させない方法

ターミナル
$find / -name file1.txt
find: /usr/sbin/authserver: Permission denied
find: /.PKInstallSandboxManager-SystemSoftware: Permission denied
find: /Library/Application Support/Apple/ParentalControls/Users: Permission denied
find: /Library/Application Support/Apple/AssetCache/Data: Permission denied
find: /Library/Application Support/ApplePushService: Permission denied
find: /Library/Application Support/com.apple.TCC: Operation not permitted
find: /Library/OSAnalytics/Preferences/Library: Permission denied
find: /Library/Caches/com.google.SoftwareUpdate.0: Permission denied
.
.
.

探索場所をルートディレクトリなどにすると、 Permission deniedやOperation not permittedといったエラーが出力されます。
これだと正しい結果が埋もれてしまって探すのが大変なので、エラーを違うところにはき出させます。

ターミナル
$find / -name file1.txt 2>/dev/null
/path/dir/file1.txt

このように、エラーが出力されず、条件に当てはまるファイルだけ表示されます。

【永久保存版】画像を極限まで軽くする方法まとめ

$
0
0

イントロダクション

近年Web業界は目まぐるしく進歩しており、昔最もモダンだった技術がその後廃れてしまうことはよくあります。
しかしいくら素晴らしいコンテンツを開発しても、見る人がいなければ意味がありません。
そして実は人々は、たった三秒で直帰してしまうのです。
三秒でですよ?
さらにその待ち時間、実はほとんどを画像の読み込みに使用してしまうのです。
だからこそ、画像を軽く速くする必要があるのです。

PNGファイルを軽くしよう

PNGファイルは、最もよく使われるフォーマットですが、
「重ーい」と感じることはありますよね?
そのような場合、大抵はサイズを変えるか下記のWebpを使用しますが、
当然それを解決する方法はあります。
PNGGauntlet公式サイト
このソフトを使うと、一瞬にしてPNGを何分の一にも圧縮できます。

Webpを使おう

Webpフォーマットは天下のGoogle様が開発したすばらし~いフォーマットですが、
対応しているブラウザが少ない(IE,Safariが未対応)のです。
そこでSourceタグ/Pictureタグを利用しましょう。

index.html
<picture><sourcesrc="sample.png"type="image/png"><sourcesrc="sample.webp"type="image/webp"></picture>

ちなみにWebpに変換するには以下のソフトが便利です。
RomeoLight WebpConv
このソフトはすごく便利ですが、一つ問題として、
アウトプットがすべてデスクトップにしか出てこないという点があります。

アイコンはSVGを使おう

SVGを生成するには、InkScapeというソフトが便利です。
InkScape

"絶対に"Base64を使おう

Base64とは、HTMLの内部に画像ファイルを埋め込む方法です。
これで読み込みの時間を凄く短縮できます。
ちなみにBase64のエンコード方法は下の記事を参照ください。
WindowsでBase64エンコード/デコードする方法
では、さっそく使ってみましょう。

index.html
<imgsrc="data:image/png;base64,{ここにBase64を入れる}"alt="スッパマリオシスターズ(仮)"/>

ちなみに、上記のSourceタグ/Pictureタグを使うやり方は下です。

index.html
<picture><sourcesrc="data:image/png;base64,{ここにBase64を入れる}"type="image/png"><sourcesrc="data:image/webp;base64,{ここにBase64を入れる}"type="image/webp"></picture>

ちなみにCSSにBase64を埋め込む方法は下です。

style.css
.el{background:url(data:image/png;base64,{ここにBase64を入れる});}

あとfaviconにはBase64使えません。

皆様へのお願い

絶対にいいねしてください。絶対に。お願いしましたよ。

初心者から考えるAIとは?

$
0
0

1.概要

最近AIという言葉がはやり出していますね。今後の主要な技術となっていますので、簡単にAIについて調べてみました。できる限り簡単になるようにまとめていますので、実際のAIとはちょっと違っている可能性があります…

2.AIとは?

AI(artificial intelligence =人工知能)
AIとは、人の脳をコンピュータを使って解き明かす研究全般を指す言葉です。そのため、「人工知能は関係ないだろう」、ということでもAIと言ってしまうことがあるようです。

例えば、以下はAI研究の中で生まれたり、使われたりするキーワードになります。

  • ビックデータ
  • 音声認識
  • 文字認識
  • 自動翻訳
  • 検索エンジン

上記どれもが人工知能を生み出すことができなかった技術群になります。(今後新しい技術が出てきたら、変わるかも…)ただ、その技術を使って、Googleの検索エンジンや、音声認識の翻訳システムなどができているので、「人工知能はできなかったが社会に役立つ仕組みに変えることができた」、と言えます。

そのため、AIに関して研究することは、決して人工知能が作れなくても応用的に別のシステムを作ることができるので学ぶものとしては非常に優秀、と言えるではないかと思っております。
(だからブームとなっている!!)

3.AIの基本構造

AIの仕組みをざっくりと言ってしまうと以下となります。

image.png

そしてこの入力に何を入れるか、処理に何を行うか、によって技術的な構造が変わってきます。

  • 入力に大量のデータを使う! ⇒ビックデータ処理
  • 処理に人の脳と同じことをさせる! ⇒ニューラルネットワーク
  • 処理に一定のルールを先に持たせる! ⇒機械学習

機械学習のルールについてもう少し詳しく言うと、例えば時間が来たら自動でツイートする機能、などが該当します(botのこと、botもある意味AIの1つに数えられている)

ディープラーニング

最近の主要な技術に「ディープラーニング」というものがあります。これを簡単に説明すると以下の図のようになります。

image.png

つまり処理の部分を何層にも重ねることによって、通常の処理ではできないことを実現して行く、という方法になります。また、入力と出力に同じものを使うことで、真ん中の処理部分を最適化することができます。(ただ処理を重ねるだけだと、初めの処理にちょっとしたずれがあった場合、そのずれをどんどん引きずるので、最後の出力のずれが大きくなる)

こちらを用いることで以下のようなメリットがあります。

  • 処理から人間では見つけることのできない方法を算出できる(入力と出力だけ決めて、それをどう処理するかはPCに任せているので)
  • どこかの処理が故障しても、何層も重なっているので無効にできる
  • 一度処理が最適化すれば何度でも使える

ただ、何層も処理を重ねるので、以下のようなデメリットもあります。

  • 処理に膨大な資源が必要!(数千台のサーバ+時間がかかる)
  • 処理が正しいかどうかの判断ができない!(入力と出力しかわからない…)

特にディープラーニングの一番問題点は、どのような処理によって結果を導き出したのかわからないことです。つまり、もしAIが暴走したとしても、なぜ暴走したのか誰にも分らない、ということになります。

そのため、AIについて警鐘を鳴らしている人たちは、AIの可視化という研究を行っているようです。
■参考
「人工知能の思考過程を可視化する、「AI監視ツール」を生み出すスタートアップ企業たち」
https://wired.jp/2019/12/11/these-startups-are-building-tools-keep-eye-ai/

4.AIを使ってできること

現在の技術力だと、ルールが明確であるもの、答えがはっきりしているものをAIで自動化するのは、比較的簡単ではないかと思います。
(将棋のプログラムやエアコンの温度制御、botなど)

ただ、複雑に絡み合ったものから答えを出す、というものはディープラーニングの力を借りる必要があり、コストの面から実現は難しいのではないかと思います。
(新たな新薬の開発、人間のように受け答えするシステムなど)

逆を言えば、今の自分たちが行っている業務を一定のルールに書き換えることができれば、AIによる自動化がより進むのではないかと思います。

5.まとめ

AIは夢のある分野だと思いますが、書籍を読んでいる限り難しい技術ですね…
ただ、音声認識、画像処理などにフリーで使えるツールを公開している企業もありますので、ちょっとした研究であれば比較的容易にできる環境が整っていると感じています。

ちょうどQiita x COTOHAでイベントを行っているので、使ってみようと思います。

Viewing all 21065 articles
Browse latest View live