Dance with Tech

プログラミングとか学んだことの備忘録ブログです。

【Swift入門】ディクショナリから値を取り出すときに順番がバラバラになって驚いた

iOSアプリを仕事で作ることになったのでSwiftを始めました。

その中で、勉強したことと少し驚いたことをメモしていきます。

タイトルの件は中盤辺りに書いています。

f:id:kmatz90:20150521221920p:plain

ちなみに僕は、Objective-Cを2年位前に本1冊終わらせたくらいで、

iOSアプリに関しての知見は殆どありません。

 

変数・定数・配列・ディクショナリ(連想配列)の宣言と初期化

上記ではそれぞれの型を指定して宣言・代入をしていますが、

型の指定は省略することができます。

var variable = 10  //Int型になる

省略した場合、自動で型を推測して実装してくれます(型推論)。

Objective-Cではできなかった模様

 

ループと配列・ディクショナリの操作

一般的で分かりやすいですね。

forの条件式の部分に()を付けることもできます。

 

驚いたこと

これが本題です。

上記のような方法でディクショナリから値(キー)を取り出すと、

1,青木さん

2,佐藤さん

3,鈴木さん

ではなく、

2,佐藤さん

3,鈴木さん

1,青木さん

のように、

初期化していた順番とバラバラになって出力されたりします

※順番通りに表示されることもあります。 

これはSwiftの仕様のようで、

 Unlike items in an array, items in a dictionary do not have a specified order.

訳:配列内の項目とは異なり、ディクショナリの項目は指定された順序を持っていません。

公式ドキュメントに記載されています。

知らなくて、何とかしようと頑張ってしまった。。

 

関数(func)

Swiftの関数は「function」ではなく「func」と表現し、

戻り値を返す場合「->」を使って型を指定します。

また、引数に初期値を設定することもできます。

 

タプル(tuple) 

タプルとは、複数の値(型が違くてもok)を1つにまとめられるものです。

配列とはまたニュアンスが違います

実際にコードを見た方が分かりやすいです↓

便利そうですが、後から要素を追加したり削除したりはできないようです。

 

Swiftの暗黙のルールとか空気感

ここまで変数の宣言を「var」で行ってきたのですが、

基本的には「let」を使って定数にし、

変数が必要な部分のみで「var」を使うってスタンスが良いみたいです。

 

あと、変数の宣言で使う型の指定ですが、

基本的には省略しちゃって良いような空気をググってて感じました。

確かにXcodeが変換してくれるとはいえ、

いちいち「String」とかタイプするの面倒。。

この辺りは賛否両論ありそうですが、

ベターな書き方が分からないので、しばらくは他人が書いたコードを読んで修行あるのみです。

 

今後も覚えたことや、気づいたことなどをメモしていこうと思うので、

興味のある方はまた来てください。

プログラミングとかウェブでよく出てくる小難しい英単語30選

よくプログラマー(エンジニア)は、

数学が得意な人じゃないと出来ないとか言われたりしますが、

個人的には数学というより、

英語が出来る(好きな)人の方が有利だと思っています。

だってプログラミングってコメント以外英語ですし。

なでしこ」とかはありますけどw

f:id:kmatz90:20150420221920j:plain

 

僕は学生時代、どちらかと言うと数学が苦手なタイプでしたが、

英語はわりと出来る方でした(というか好きだった)。

もちろん、数学も出来た方が有利に決まっていますが、

普通にご飯を食べていく分にはそんなに必要無いと思います。

 

ということで、

英語の意味を理解すると、仕事が更に捗るんじゃないかと思いまして、

プログラミングとかウェブで出てくるけど、

ちょっと意味が分かりづらい英単語30個をまとめてみました!

 

プログラミングで出てくる英単語30選

英単語読み方意味
allocate アロケート 割り当てる
attr(attribute) アトリビュート 属性
bind バインド 結び付ける
component コンポーネント 部品、構成要素
description ディスクリプション 説明
exception エクセプション 例外
exec(execution) エグゼック 実行
extend エクステンド 拡張する、継承する
extract エクストラクト 抜き取る
fatal フェイタル 致命的な
fetch フェッチ 取ってくる
function ファンクション 機能
grant グラント 付与
ignore イグノア 無視する
implements インプリメンツ 実装する
init(initialize) イニット 初期化する
instance インスタンス 実体
invalid インバリィド 無効
notice ノーティス 予告、通知
parse パース 構文解析する
prefix プリフィックス 接頭語
prepend プリペンド 先頭に追加する
previous プリヴィアス 前の
render レンダー 表現する
state ステート 状態
static スタティック 静的
swap スワップ 交換
syntax シンタックス 構文
temp(temporary) テンプ 一時的な
validation バリデーション 検証

※2015/4/22 追記

  • instanceのスペルミスを修正
  • implementsの意味を「実装する」に修正
  • noticeの意味に「通知」を追加

implementsは非常に勉強になりました!

もう忘れることは無いと思いますw

ご指摘頂いた皆様、ありがとうございました!

 

まとめた結果

.

..

...

英語の勉強みたいになった。

 

暗殺教室 殺たん (JUMP j BOOKS)

暗殺教室 殺たん (JUMP j BOOKS)

 

【Linux】サイズの大きいファイルはお前だ!消してやる!

タイトルの通り、

ストレージ内で容量の大きいファイルを見つけて削除する、Linuxコマンドをまとめました。

f:id:kmatz90:20150415235831j:plain

環境はAWS(EC2)でCentOS7です。

CentOS7の構築については、

少し前に書いて何故かとても読まれた過去記事を参照してください。

 

ぶっちゃけ簡単だし、

ググればこの手の類はいくらでも出てくるのですが、 

念のため備忘録としてまとめておきます。

 

メールのキューが溜まっている場合は以下で対応。

あんまり無いと思うけど。

 

これで今後忘れてもググらずに済むはず。

ログとかのファイル削除に関しては、

定期的に消すシェルなどの仕組みを作るのが1番良いですね。

CentOS7でPHPとか動かすところまで構築するのに使ったコマンドまとめ

こういったインフラ周りは日頃触らず忘れやすいので、自分の備忘録としてまとめておきます。

環境はAmazon EC2です。

f:id:kmatz90:20150129154118p:plain

 

 CentOS6.xと7の主な変更点

  • service」コマンドと「chkconfig」コマンドが、「systemctl」コマンドに統合
  • iptables」が「firewalld」に変更
  • 「ntpd」が「chronyd」に変更
  • 「ifconfig」が「ip」コマンドに変更

 

ユーザーを「centos」から「root」に切り替える方法

CentOS7の場合、初期ユーザが「centos」でした。

「root」になるには新しくパスワードを作成する必要があるようです。

 

Apachのインストール

「service」コマンドは「systemctl」コマンドに変わったので、以下になります。

 

chkconfig -listの代わりに

以下のコマンドで、自動起動設定を一覧で確認出来ます。 

 

firewall(iptables)の設定

iptablesもfirewallに変わったので、設定の方法が異なります。

 

時刻合わせ

 

PHP周りで使いそうなものをインストール

この辺りは、CentOS6.xと変わりません。

PHPのバージョンは5.4がインストールされました。

以下でもできます↓(むしろこっちの方がスマート)

yum -y install php php-mbstring php-mysql...

 

PEARをインストール

使うと思われるものをインストール。

 

postfix (デフォで入ってる模様)の設定

メールを送受信したい場合は、postfixの設定を変更しましょう。

 

おまけ

上述したコマンドは全てGitHub Gistを使って埋め込んでいるのですが、

せかせかと書いていたら突然BANされました↓

f:id:kmatz90:20150131140430p:plain

更新しすぎてスパマーだと思われたのが原因のようです。

しかし、Contactページから問い合わせたらすぐ直してもらえました。

件名:I'm not a spammer.

本文:Please reinstated my gist account.

 みなさんも更新のし過ぎにはお気をつけください。

 

Code Complete 第2版 上 完全なプログラミングを目指して

Code Complete 第2版 上 完全なプログラミングを目指して

 

PHPのスーパーグローバル変数の一部はcronでは動かないんだってばよ

f:id:kmatz90:20141220221620g:plain

AMIを使っていくつか作成したインスタンスAWS)からホスト名を取得して、それを別サーバーに渡す処理を作ろうとしました。

で、ホスト名以下のスーパーグローバル変数を使用して取得出来ました。

めでたしめでたし。

あとはこれをcronで回せばお終いっと♪

 

、cronを実行してログを確認したところ、エラーが返ってきたのです。

ファイルのパスとかを確認しても確実に合ってる。

何故にと思いググってみると、$_SERVER['SERVER_NAME']はcronでは動かないというショッキン&ファッキンな事実を目の当たりに。

ガ━━(゚Д゚;)━━━ン!!!!!

 

仕方ないので別の方法(any other way)を探すことに。

調べた結果、以下で取得出来るらしい。

試してみると、Private IPが返ってくる。

今回僕は外部サーバーとファイルのやりとりを行いたかったので、

Private IPではなく、Public IPがほしーのです。

f:id:kmatz90:20141220231722j:plain

他には、unixコマンドを使って、無理やりexecで動かすという方法もあるようですが、パフォーマンスに影響が出るというのと、あまりクールじゃないイメージがあるのでスルー。

 

結局、こんなんで時間かかり過ぎても無意味なので、

不本意ですがベタにdefineで定義することに。。

この辺りの解決策はないものか。。

 

※追記

有り難いことに、色々な方から「はてブ」のコメントでアドバイスを頂きました。

結論としては、cronでcurlを使って別のPHPファイルを呼び出し(http経由)、

そのPHPファイルでホストを取得する方法。

これがベストな解かなと思いました。

ありがとうございました!

 

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

 

 

ナウでヤングなHTML5を使ってサクッとファイルをダウンロードさせる

この記事は「1分で実現できる有用な技術 Advent Calendar 2014」の 18日目の記事です。

Qiitaで催されているアドベントカレンダーに参加してみました。

 

本題

何かの機能を作っていて、ユーザーにファイルをダウンロードさせたいときがあると思います。

そのときに、PHPのheaderとかreadfileを使ってDLさせるのも良いのですが、もっとサクッと出来ます。

※僕は一応PHPerなのでPHPを例にしました

 

方法はイケイケでナウでヤングなHTML5を使います。

f:id:kmatz90:20141218001411p:plain

そして、a要素のdownload属性を使います。

これだけ。

 

さらに、downloadの属性値は省略できます。

省略した場合、ファイル名がダウンロード時のファイル名になります。

マジでナウでヤングだわ。

 

がしかし

対応しているブラウザが「Google Chrome」、「Firefox」、「Opera」のみという何とも絶妙な仕様。

社内システムとかで、使っているブラウザが決まったりしている場合などに使える小技です。

 

HTML&CSS標準デザイン講座 【HTML5&CSS3対応】

HTML&CSS標準デザイン講座 【HTML5&CSS3対応】

 

 

Vagrant使ってnode.jsとか色々ぶっこんでいくついでに解説とかしていくんで夜露死苦!

前回はMEAN Stackの話を書きました。

今回はVagrantを使って作った仮想環境に、node.jsとか色々突っ込んでいこうと思います。

Vagrantのインストール

f:id:kmatz90:20141030120027p:plain

とりあえず、下記サイトを見てやれば、

VirtualboxのインストールからWebページの表示まで完遂出来ます。

boxファイルのインストールやApacheの設定なども載っています。

web帳 | VirtualBoxとVagrantで開発環境を構築

※今回はCentOS6.4をインストールしました

 

仮想環境にnode.jsを入れる

node.jsをインストールするにはEPELリポジトリが必要なので、下記のコマンドを実行します。

EPELリポジトリとは、CentOSに元から入っているリポジトリでは提供されていないパッケージが、yumでインストール出来るようになるリポジトリです。

EPELリポジトリにnode.jsが入っているのでインストールが可能になります。

node.jsの特徴

f:id:kmatz90:20141029205654p:plain

nodeは厳密に言うとプログラミング言語では無い

nodeはサーバーサイドJavaScriptです。

用途としては、ApacheとかのWebサーバー構築ソフトと置き換えて使うイメージです。

 

シングルスレッドでしか動かない

シングルスレッドなので、どんどんアクセスを受け付けてしまいます。

そのため、速く処理できないとパンクします。

対義語はマルチスレッド

 

シングルスレッドでも速く動かすために、ノンブロッキングI/Oとイベントループというモデルを採用している

ノンブロッキングI/O(非同期IO)とは↓

コンピュータ内部のCPUと周辺装置のデータ入出力(I/O)において、データの送受信の完了を待たずに他の処理を開始する方式。並列処理の一種。

非同期I/Oでは、I/O処理と並列に、データの送受信が完了していなくても可能な処理を進め、送受信が済まないと進められない処理にたどりついた場合に、そこで送受信の完了を待つ。

これに対し、正常に送受信が完了したかどうかの結果を待ち、送受信処理に完了してから残りの処理を行う方式を同期I/O(ブロッキングI/O)という。

IT用語辞典より

 

イベントループとは、受けたリクエストを1つ1つ処理していくモデルです。

1つずつしか処理しないので、メモリを圧迫せずに済みます。

これに対し、複数のリクエストをまとめて処理するのがスレッドモデル。

 

ノンブロッキングI/Oとイベントループの特徴を活かすと

AさんとBさんが同時にリクエストを投げた場合、

Aさんがリクエストした処理に時間がかかっていたとしても、その完了を待たずにBさんがリクエストした処理に移れます。

 

Gitをインストール

たぶん入れておいた方が良いのでGitを入れます。

GitをインストールするにはRPMforgeが必要なので先にインストールします。

※CentOS7からはGitがデフォで入っているようです。

RPMforgeとは、EPELリポジトリと同じでyumを強くするようなリポジトリです。

RPMforgeリポジトリがインストール出来たら、Gitをインストールします。