interprism's blog

インタープリズム株式会社の開発者ブログです。

アセンブリで簡単なプログラムを作る編

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の13日目 の記事です。

アセンブリで簡単なプログラムを作る

こんにちは、yumeです。最近アセンブリについて学習したので、簡単に何か、0から入力した正整数までの和を返すものを作ってみます。

はじめに

  • アセンブリとは、機械語(0と1)をもう少し人間にとって分かりやすい形にした言語です。
  • NASMというアセンブラを使っています。
  • 環境構築の部分は省略します。
  • 「詳しいことは(ひとまず)置いておいて、とにかく実装を見たい!」という人を意識して書こうと思ってます。

まずは10までの足し合わせ

section .text
global _start

_start:
mov     eax, 0      ;レジスタの初期化。eaxに0を入れる
mov     ecx, 10     ;ecxレジスタはカウンタとして使用される。今回は10までなので、ecxに10を入れる

_loop:
add     eax, ecx    ;eaxにecxを足す
loop    _loop       ;ecxがデクリメントされて_loopラベルへ

call    print       ;下で定義したprintサブルーチンを呼び出す

mov     eax, 0x0a   ;改行を出力
call    print

mov     eax, 1      ;
mov     ebx, 0      ;
int     0x80        ;システムコール。この一連で動作が終了する。慣れないうちは何がなんだか

print:
push    eax         ;eaxの中身をスタックへ逃す
mov     eax, 4      ;標準出力の準備
mov     ebx, 1      ;
mov     ecx, esp    ;出力するのはesp、つまりスタックの先頭
mov     edx, 1      ;1byte分の出力
int     0x80        ;システムコール
pop     eax         ;スタックから戻す
ret                 ;サブルーチンの呼び出し元へ

これを実行すると、

7

と出ます。「何事だ?」と驚かず、冷静にASCII文字コード表を見ると、文字'7'は10進数で55。一応、計算は出来ていそうです。

が、このままだとなんだか気持ち悪いので、10進数で返って来るようにします。

section .text
global _start

_start:
mov     eax, 0      ;レジスタの初期化。eaxに0を入れる
mov     ecx, 10     ;ecxレジスタはカウンタとして使用される。今回は10までなので、ecxに10を入れる

_loop:
add     eax, ecx    ;eaxにecxを足す
loop    _loop       ;ecxがデクリメントされて_loopラベルへ

mov     edx, 0      ;この後のdiv演算でedxには剰余が入るので、初期化
mov     ebx, 10     ;この後のdiv演算での引数になるレジスタ
div     ebx         ;これを書くだけで、eaxをebxで割り、結果はeaxに、余りはedxに格納される。面白いけど分かりにくい
add     eax, '0'    ;ASCII文字に変換するために'0'を足す
add     edx, '0'    ;

push    edx         ;一の位をスタックに避難
call    print       ;ここで出力されるのは十の位
pop     edx         ;

mov     eax, edx    ;
call    print       ;printサブルーチンを呼び出す

mov     eax, 0x0a   ;改行を出力
call    print

mov     eax, 1      ;
mov     ebx, 0      ;
int     0x80        ;システムコール。この一連で動作が終了する。慣れないうちは何がなんだか

print:
push    eax         ;eaxの中身をスタックへ逃す
mov     eax, 4      ;標準出力の準備
mov     ebx, 1      ;
mov     ecx, esp    ;出力するのはesp、つまりスタックの先頭
mov     edx, 1      ;1byte分の出力
int     0x80        ;システムコール
pop     eax         ;スタックから戻す
ret                 ;サブルーチンの呼び出し元へ

これで実行すると、

55

となります。

続きを読む

Windows10でエクスプローラの右クリックメニューからPowerShellあるいはコマンドプロンプトを管理者権限で開けるようにする

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の12日目 の記事です。

Windows10にアップグレードしたのですが・・・

こんにちはito.yです。

最近、使用している環境をWindows7からWindows10へとアップグレードしたのですが、 エクスプローラ上で「Shift+右クリック」を押すことで表示されていた「コマンドウィンドウをここで開く」が「PowerShellウィンドウをここに開く」に変更されました。

f:id:interprism:20180104010309p:plainf:id:interprism:20180104005951p:plain
左:Windows7 右:Windows10
個人的にはPowerShellも使用頻度が高いため変更される分には問題ありませんが、1つ許容できない部分がありました。
それは、 管理者権限で実行できないこと です。
Windows7の時は下図のユーザーアカウント制御画面で設定を通知しないに変更しておけば、UACが無効化されて自動的に管理者実行となっていたのに対し、 Windows8から変更された管理者権限の仕様のせいか、設定を変更しても管理者権限で実行することができなくなっています。
f:id:interprism:20180110231731p:plain:w300
UAC設定用のスライダーを下げても効果なし。。

本記事では対策方法を2パターン紹介します。
PowerShellではなくコマンドプロンプトで開きたい場合もパターン2の方法で対応可能です。

ただし、いずれもレジストリの変更が必要となります。 事前にPCのバックアップをするなどの準備をし、自己責任で実施してください。

  • 検証環境
    • エディション:Windows10 Home
    • バージョン:1709
    • OSビルド:16299.125
続きを読む

アジャイルテスト(後半)

実践アジャイルテスト

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の7日目 の記事です。

背景など

インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の6日目で投稿した interprism.hatenablog.com

の後半になります。

今回はこの本の14章を主にまとめたいと思います。
テストで「何を自動化すべきか」、「何を自動化すべきでないか」について記述します。

続きを読む

お酒は飲んでも飲まれるな

おいしくお酒を飲むために

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の11日目 の記事です。

背景など

社会人になって「自分の会社で飲み会」、「仕事先の人と飲み会」などお酒を飲む機会が多くなりました。
ましてや12月は忘年会などもたくさんあり、お酒を飲む機会が多いですよね
みなさんはお酒は大好きですか?
私は大好きです!!

今まではお酒をひたすら飲んで酔っ払うだけでしたが「このままではダメだ」と思い、カクテルの勉強を始めました。
お酒の名前の由来などを知ってるとお酒の席での小話になったり、今までと違ったお酒の楽しみ方を発見できたりします。

最近ではワインをよく飲んでるのでお家で簡単に作れるワインのカクテルを紹介します。

続きを読む

再帰クエリで木構造のデータを取得する

再帰クエリで木構造のデータを取得する

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の10日目 の記事です。

yoshiといいます。
今回は再帰クエリを用いて木構造のデータを取得する方法について書いてみました。
使用したデータベースは Microsoft SQL Server 2017 Express です。

木構造のデータ

今回使用するデータは、次のような構造のデータとします。

     Id     |   ParentId
------------+------------
 1          | (NULL)
 2          | 1
 3          | 1
 4          | 2
 5          | 2
 6          | 3
 7          | 3
 8          | 4
 9          | 4
 10         | 5
CREATE TABLE [Node](
    [Id] int NOT NULL,
    [ParentId]  int NULL
)
INSERT INTO [dbo].[Node] VALUES
    (1, null)
    ,(2, 1)
    ,(3, 1)
    ,(4, 2)
    ,(5, 2)
    ,(6, 3)
    ,(7, 3)
    ,(8, 4)
    ,(9, 4)
    ,(10, 5)

JOINを使用して子の一覧を取得する

単純にJOINを使用して取得しようとすると、以下のようなクエリになってしまいます。

SELECT
        n1.Id, n2.Id, n3.Id
    FROM
        [dbo].[Node] AS n1
        LEFT OUTER JOIN [dbo].[Node] AS n2
            ON n1.[Id] = n2.[ParentId]
        LEFT OUTER JOIN [dbo].[Node] AS n3
            ON n2.[Id] = n3.[ParentId]
    WHERE
        n1.Id = 2
/*
     Id     |     Id     |     Id     
------------+------------+-------------
 2          | 4          | 8
 2          | 4          | 9
 2          | 4          | 10
*/

階層の数だけJOINする必要があるので、

  • 取得したい階層の数が変わるごとにSQLを修正する必要がある
  • 「指定したIDの子すべてを取得する」など、取得する階層の数が不明な場合に対応できない

と言った問題があります。

再帰クエリを使用して取得する

しかし、再帰クエリを使用することにより上記の問題を解決することができます。

WITH [temp]([Id], [ParentId], [Depth])
AS
(
    SELECT
            n.[Id]
            ,n.[ParentId]
            ,1 AS [Depth]
        FROM
            [dbo].[Node] AS n
        WHERE
            n.[Id] = 2
    UNION ALL
    SELECT
            n.[Id]
            ,n.[ParentId]
            ,t.[Depth] + 1 AS [Depth]
        FROM
            [dbo].[Node] AS n
            INNER JOIN [temp] AS t
                ON n.[ParentId] = t.[Id]
)

SELECT
        *
    FROM
        [temp]

/*
     Id     |   ParentId|   Depth
------------+-----------+-------------
 2          | 1         | 1
 4          | 2         | 2
 5          | 2         | 2
 8          | 4         | 3
 9          | 4         | 3
 10         | 5         | 3
*/

再帰クエリではUNION ALL 以下のSELECT文の結果が空になるまで繰り返し実行されるため
階層の数を指定する必要がありません。
よって、JOINのような問題が生じることもありません。

注意点

再帰クエリは標準sqlの共通表式の一環として定義されていますが、
MySQLなどサポートしていないDBMSも存在しますので注意が必要です。
(MySQL 8.0 ではサポートされるらしいですが……)

インタープリズムのページ

アジャイルテスト(前半)

実践アジャイルテスト

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の6日目 の記事です。

背景など

今年から現場が変わり、初めてアジャイルを経験しました。 初めてのことも多くて失敗することもありましたが、なんとか生き延びることができました…

私たちのチームでは1週間で区切り、開発を行っていました。 小さい機能改善や不具合の修正を毎週リリースをした期間などもあり生産性が高く、 モチベーションも十分で開発を進めることができました。 (※毎週リリースと言っても並行で開発しているので開発期間は1週間ではない)

しかし、、、、

アジャイルを通して開発を進めていくにしたがって、

この製品の品質は大丈夫なんだろうか…

と不安がどんどん大きくなっていきました。 そんなときに「実践アジャイルテスト」という本に出会いました

f:id:interprism:20171228154107p:plain

今回は備忘録として本の内容をまとめたいと思います!

前半は主に6章~12章のまとめになります。

アジャイルテストの4象限

テストをする理由や目的は様々あります。
「バグを見つけるため」、「コードの信頼性を確認するため」などなど
本書ではテストをする目的を4つの象限に分けます。
まず一つの軸は「ビジネス面のテスト」と「技術面のテスト」かどうかで分けられます。
もう一つの軸は「チームを支援する」か「製品を批評する」かどうかで分けられます。
※「批評」という言葉は否定的な言葉ではなく、称賛と改善のための提言を含む

f:id:interprism:20171228161020p:plain

第1象限(Q1)

第2象限(Q2)

  • 最も重要な目的の1つは、情報をできるだけ早く提供して迅速な問題解決を可能にすること
    →そのため頻繁にテストを行わなければならないため自動化する必要がある
  • これらのテストを製品の外部品質の定義のために使う
  • 最も重要なことは機能がどのように動くべきかの例を顧客に求めること

第3象限(Q3)

  • ソフトウェアが期待にあっているか、あるいは競争相手に勝っているかをみるためのもの
    プログラマがビズネス面のテストをパスするコードを書いたとしても、顧客が欲しいものを提供しているとは限らない
  • 探索的テストはエンドユーザーがするのと同じように行うためテスターは想像能力を直観力を使う
    →多くの重大な欠陥がこの過程で見つかることが多い
  • テスト準備、データ生成、繰り返し作業、あるいはワークフローを開始したいところまでなどは自動化可能

第4象限(Q4)

  • パフォーマンスやセキュリティ要求などは実際の機能性より重要かもしれない
    →例えばネット販売サイトでレスポンスが1分かかるとしたらお客は機能が充実していようと評価はしてくれない
  • これらのテストは機能テストより早く行われることさえある

結論

後半に続く!………かも

インタープリズムのページ

いくつかのポイントさえ押さえれば、自分でもおどろくようなプレゼン資料ができちまうもんだよ。

f:id:interprism:20171221100558j:plain

こんにちは!hanaです。
今回は、自分はデザインセンスないと思い込んでいるそんな非デザイナーなあなたに
「hana式・見た目イケテルプレゼン資料の作り方」をご紹介します。
プレゼン資料といっても様々あるとは思いますが、ここではPowerPointKeynoteなど、プレゼンツールを使用したスライドプレゼンにフォーカスを当ててみます。


【問題→現状把握】ターゲットに伝えたいことをどうやって表現すれば伝わるかわからない

「内容は固まってるんだよね〜・・でもどうやったら伝わりやすいプレゼン資料作れるだろう・・・? あー、そもそもセンスねぇやー orz」

【分析】わかりやすいプレゼン資料の定義って?

定義1. プレゼンする対象・ターゲットとなる人物がはっきり見えてくる。
定義2. ストーリー構成が起承転結になっている。
定義3. 対象者に理解・納得してもらうための理論展開が明確である。
定義4. 色や文字の大きさ、図形やグラフといった視覚的に対象者が理解しやすいよう工夫がされている。

これらに限りませんが、私が資料を作る際はだいたいこの4つに気をつけたいと思っています。
さらに今回はターゲットや流れ、理論展開は決まっているけど視覚的表現が上手くいかないという、定義4のデザイン・レイアウト改善案にしぼってご紹介します。

【課題】定義4をさらに分析し、ポイントごとに解決策を考えていく。

  1. 1ページに文字が多すぎる。
  2. 全体的にレイアウトがバラバラ。
  3. ページ内の情報がばらついていてグループ化できていない。
  4. 文字や図形にメリハリがなく、どこを見ていいかわからない。
  5. 文字のスタイルがバラバラで、どこが重要であるかの判断がつきづらい。
  6. 重要なことは赤くすればいいと思っている。
  7. 数字や時系列のデータ・箇条書きを表やグラフで表そうとか、ぱっと思いつけない。
  8. コンテンツ間のスペースを上手に取れず、どうしても余白にはイラストとか入れたくなる。
  9. アジェンダ?なにそれおいしいの?
  10. これら踏まえても結局よくわからない
続きを読む

PAGE TOP