OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのgemを読むときのTIPS

私がgemのコードを読むときに使う小ネタを紹介します。

## コードリーディング時の流れ

おおまかに下記のように進めます。

 1. gem内の実行箇所を把握
 - ステップ実行でコードの流れを把握
 - 用途不明のオブジェクトはそのコードを読む
 - ある程度理解できるまで 2-3を繰り返す

## gem内の実行箇所を把握
リーディング対象の機能の実装箇所を特定するためにbyebugを利用します。
byebugを仕込む箇所は、テストやそれ用に追加した小さい機能に対して仕込むと良いでしょう。
byebugで止めた箇所からステップ実行を繰り返すことで、gem内のファイルにたどり着けます。

この時gemにたどり着くまでにステップ実行の回数が多いならgemのコード内にbyebugを仕込む事をおすすめします。
そうしておくと、次に実行したときにgem内のファイルにたどり着くまでにステップ実行回数が少なく済みます。
gemのソースを直接いじるのは危険が伴いますが、`bundler`の`--path`オプションを利用すれば安全に扱えます。

RDocが整備されているgemなら、ドキュメントからGitHubの実装箇所に飛べるので、そこからコードの場所を特定可能です。


## ステップ実行でコードの流れを把握
ステップ実行でコードの流れを把握します。
この時、ある程度理解したら自分の脳内スタックをメモか何かに書き出すことをおすすめします。
私の場合はこれをやらないとコードをどこまで読み、理解したかがわからなくなるからです。


## 用途不明のオブジェクトはそのコードを読む
途中でよくわからない処理やオブジェクトが出てきたら、そのオブジェクトをputsやppなどで出力し、クラス名を把握します。
クラス名をヒントにgem内の実装を特定、確認します。
それでもわからなければそのクラスの初期化コードにbyebugを仕込み、どこでどのように使われているかを把握します。

## ある程度理解できるまで 2-3を繰り返す
あとは繰り返しです。
がんばりましょう。

---

## その他の小ネタ

### bundle install --path vendor/bundle
gemのインストール先を変更するオプションです。
gemのソースにbyebugやputsなどをを仕込む時、通常のGEM_PATHにあるgemのソースコードを修正してしまうのは危険です。
デバッグ用の修正を戻し忘れたに別プロジェクトに影響が出てしまいます。
なので、コードリーディング時の影響はコードリーディングを行っているプロジェクトに限定したいと思います。
--pathオプションを利用すると、そのプロジェクトで使用するgemのインストール先を特定のディレクトリ直下に指定できます。
これにより、修正を戻し忘れた時に別プロジェクトに影響を与えずにすみます。

### bundle open
gemのインストール先のディレクトリを開くコマンドです。
gem中のソースにprintなどのデバッグコードを仕込む際に利用できます。

### RubyMineのコードジャンプ
ちなみに、gemのコードの特定などはRubyMineのコードジャンプ機能で一発で特定可能です。
コードリーディングときに非常に便利なのでオススメです。

## 終わりに

この方法は我流な読み方なので、もっとスマートな別の方法もあるかと思います
もしそのようなやり方や別のやり方があればコメント欄でご指摘いただけると幸いです。



## 参考リンク
https://bundler.io/v1.17/man/bundle-install.1.html
https://qiita.com/jnchito/items/bcb2bb5311a44113fdd9
https://www.jetbrains.com/ruby/
Window関数のLAST_VALUEの罠にハマった

Window関数便利ですよね。
便利すぎてめっちゃ使ってたら最近あることにハマったので記録しておきます。

### ぶつかった問題

`LAST_VALUE`を使って、ユーザごとの最後のアクションを知りたい。
ということでこんなクエリを出したけど、なぜか`LAST_VALUE`の値が自分自身になる

```sql
SELECT
    user_id
    ,td_url
    ,time
    ,LAST_VALUE(td_url) OVER (
        PARTITION BY user_id
        ORDER BY time
    ) AS last_url
FROM pageviews 
```
予想

```
user_id | time   | td_url   | last_url
------- | ------ | -------- | --------
AAA     | 00:01  | url_1    | url_3
AAA     | 00:02  | url_2    | url_3
AAA     | 00:03  | url_3    | url_3
BBB     | 00:01  | url_1    | url_1
```



結果

```
user_id | time   | td_url   | last_url
------- | ------ | -------- | --------
AAA     | 00:01  | url_1    | url_1
AAA     | 00:02  | url_2    | url_2
AAA     | 00:03  | url_3    | url_3
BBB     | 00:01  | url_1    | url_1
```

・・・？！
いろいろ試行錯誤したところ、

* `FIEST_VALUE`を確認しが、それはうまくいく。なぜ`FIRST`がいけて`LAST`がいけないのか...
* 同じように`MAX`も値が意図しないものになったけど`MIN`は正しい。「最後」を取る系がだめ？
* `RANK`や`LEG`なども問題ない。PARTITIONの設定などはおかしくなさそう


### 解決策

* `RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`をつける

```sql
SELECT
    user_id
    ,LAST_VALUE(td_url) OVER (
        PARTITION BY user_id
        ORDER BY time
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    ) AS last_url
FROM pageviews 
```

答えは、[公式リファレンス](https://prestodb.io/docs/current/functions/window.html)：3つめの黒ポチ にありました。

* `OVER`内のクエリには、デフォルトで`RANGE UNBOUNDED PRECEDING`がつく（明示しないとこれになる）
* これは`RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`と同義で、`PARTITION`で区切ったうちの「1つ目」から「自分」までしか調べませんよ、という意味
* `FIRST_VALUE`が成功したのは、`FIRST`＝「1つ目」さえ取れていれば正しい値が取れるから
* だからTreasureDataの人もなるべく`FIRST_VALUE`使ってねって言ってくれている
    * 参照：[TreasureDataの記事](https://support.treasuredata.com/hc/ja/articles/216392117-Window-%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99-%E9%9B%86%E7%B4%84%E9%96%A2%E6%95%B0%E7%B3%BB-)
* 実際`CURRENT ROW`にしたら正しくない値に戻った
* でも実際使うときにこれくっつけるの長いし忘れそうなので、`DESC`と`FIRST_VALUE`が良さそう

```sql
SELECT
    user_id
    ,td_url
    ,time
    ,FIRST_VALUE(td_url) OVER (
        PARTITION BY user_id
        ORDER BY time DESC
    ) AS last_url
FROM pageviews 
```

結果

```
user_id | time   | td_url   | last_url
------- | ------ | -------- | --------
AAA     | 00:01  | url_1    | url_3
AAA     | 00:02  | url_2    | url_3
AAA     | 00:03  | url_3    | url_3
BBB     | 00:01  | url_1    | url_1
```

よしよし:grinning:

### 結論

ドキュメントをよく読もうな
AtCoder Problemsのソートを改善した話


[AtCoder関連サービス Advent Calendar 2018](https://adventar.org/calendars/2932) 24日目です。

## Introduction

開始時間だけをキーとすると、開始時間が同じ複数コンテストがばらばらになってしまうし、問題順もうまくソートされない。`[startEpochTime, contest.title, problem.title]`をキーとして比較するしかないように思える。

## Pull Request

https://github.com/kenkoooo/AtCoderProblems/pull/87

## UserScript

以下より試せます。UserScriptだけだとどうしても/atcoder/dist/bundle.jsを読みに行ってしまうようなのですが、documentElementをいじるようにすればうまくいくっぽい。

```js
// ==UserScript==
// @name        AtCoder Problems Sorter
// @namespace   com.cielavenir
// @description AtCoder Problems Sorter
// @include     https://kenkoooo.com/atcoder/*
// @run-at      document-start
// @version     0.0.0.1
// ==/UserScript==

(function(){
	var src='https://gistcdn.githack.com/cielavenir/8923c3437dd694f882bbe9fe2f9ec3b8/raw/067dbe108490897cd70c8cf6d543913ffb0a1968/bundle.js';
	var scr=document.createElement('script');
	scr.src=src;
	document.documentElement.appendChild(scr);
	//document.addEventListener('DOMContentLoaded',function(){
	//	var scrs=document.getElementsByTagName('script');
	//	for(var i=0;i<scrs.length;i++)if(scrs[i].src.indexOf('bundle')>=0)scrs[i].src=src;
    //});
})();
```

開発中は、srcにlighttpdなlocalhostを指定してました。bundle.jsはreadmeに書いてあった方法で生成しました。

## 参考：arc096周辺を表示した図

左：Firefox(UserScript未適用)　右：Google Chrome(UserScript適用済)

左ではコンテストの開始時間が同一のARC/ABCエントリが混ざってしまっていることがわかります。

![arc096.png](https://qiita-image-store.s3.amazonaws.com/0/29692/ecff8625-77f6-a29e-1852-d66466aa5450.png "arc096.png")

## 余談

私、度重なる改善要求のためか、氏からブロックされているのですが、その改善要求の主なものは、今回解決したソートの問題、およびまれにAtCoderの提出を取りこぼすことがあるのの2点です。後者、気にする人は少ないかもしれませんが、ゴルファーである私には死活問題なのですよ…スクレイピングの話だからクライアントサイドで直せませんしね…

## 190107追記

とりあえずEducational DP ContestのAC者数が全く異なっていて、よくよく見てみたらFA者も一部間違っているということはわかった[(本来の一覧)](https://dp.contest.atcoder.jp/statistics)。
取得が重たいからということはわかるんですが、なんとかなるまではブロックを解除してもらいたい気持ちも起こらないですね…

<!--
\#スクショです https://qiita-image-store.s3.amazonaws.com/0/29692/252c96ca-0cdb-0499-bb4a-0866760b512c.png
-->
管理しやすい(と思う)Flutterプロジェクトのディレクトリ構造

## プロジェクト構造

それは、生産性に直結する重要なファクターであり、特にドキュメントがない(できれば作って欲しい)ので、オープンソースのプロジェクト参考にしたり、フレームワークに則って構築する

## どんなの？

![スクリーンショット_2018-12-24_1_01_05-2.png](https://qiita-image-store.s3.amazonaws.com/0/118247/e34c3f7a-8e9c-2455-10b6-6667b2304b2d.png)


※Laravelのプロジェクトを参考にした節があります

## 説明

ルート階層はFlutterが自動生成したもので、 `lib`以下の構造について書きます

### common

よく使うWidgetは共通Widgetとして切り出してここに配置します

### components

web系でいう、view(ページ)に当たる部分です。

更に下はviewごとにディレクトリがあり、ほかに `app.dart` と `importer.dart` を配置しています。

例

```
components
├ home/
├ goods/
├ app.dart
└ importer.dart
```

#### app.dart

ディレクトリ構造とは離れますが、一応説明

ここでは `MaterialApp` を返しています

おいおい説明しますが、はじめに呼ばれる `lib/main.dart` はほとんど `runApp` してるだけです。

#### importer.dart

大体のcomponentで使用されるライブラリはここで全部 `export`させておきます

```dart:importer.dart
export 'package:flutter/material.dart';
export 'package:fluro/fluro.dart' show TransitionType;

...
```

でcomponentたちに

```dart
import '../importer.dart';
```

importして、スッキリします


### configs

ここではグローバルな変数/定数を扱います

変数だと

```dart

class App {
  static Router router;
  static AppPreference preference;
}
```

定数だと

```dart
class AppColor {
  static const mainColor = const Color(0xFF315D79);
  static const main2Color = const Color(0xFF707070);
}
```

みたいにしておきます。

前者の　`App` クラスはシングルトンに扱うものは全部ここで管理すると楽です

### helpers

staticな関数を配置します

```dart

import 'dart:io' show Platform;

class FontHelper {
  static double size(double size) => Platform.isAndroid ? size - 2.0 : size;
}
```

### models

モデルクラスを配置します

### repositories

DBアクセスを使用するアプリの場合にはRepositoryを配置します

Flutterだと `sqlite`になると思いますが、

ORマッパーがないので、自作してここに置いてあります。

### routes

ルーティングの設定はここに配置します。

`fluro` 使ってしかRoutingしたことないんですが、ここに `fluro` のconfigureとか買いえます。

### services

サービスはここに配置します

先程[#configs](configs)で説明した `App`クラスにシングルトンなサービスを閉じ込めてどこでもアクセスできるようにしています

### main.dart

[#components](components)項でも触れましたが、基本的に `runApp`しかしてないです。

あとはここでしかできないことはここでやります(FlutterCrashlyticsの設定とか)


## 終わりに

参考になると嬉しいです。
TypeScript x React x Firebase Hostingの環境構築&デプロイを1行で

この記事は、[今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018](https://qiita.com/advent-calendar/2018/yumemi01_one-liner)の22日目の記事です。

ワンライナー、なんかgitやらサーバやらは結構たくさん世にでている気がするので、
ちょっとひと味違うワンライナー(？)をかきました。

## ワンライナー

```bash
npx create-react-app my-app --scripts-version=react-scripts-ts; cd my-app; expect -c "spawn firebase init hosting; expect \"Select a default Firebase project\"; send \"\n\"; expect \"What do you want to use as your public directory?\"; send \"build\n\"; expect \"Configure as a single-page app\"; send \"\n\"; interact;"; npm run build; firebase deploy --only hosting;
```

※前提、node.jsをいれてnpxが使えるようになっていること、firebase loginを済ませていること


## 簡単に解説

なんでこんなワンライナーを書いたかというと、
最近フロントエンドでなんかしたいな、というときに考えることが多くてめんどくさいな、
というところで。

もう、とりあえずでいいんや！ってときでも、ちょっと考えたり、選んだりしてると、やる気と時間を奪われかねないので、
とりあえずのベストプラクティスを1行で提供してみました。

やってることは、
npx(その場限りのnpm、みたいなものです)をつかって、
create-react-app(reactアプリケーションで楽にスタートさせるための環境)で環境を作って、
firebaseプロジェクト化して(firebase init hosting)、
reactのビルドをして、
firebase hostingにdeployしています。

ポイントは、expectを使っているところで、
firebase initしたときの対話をすべて自動化しています。
デプロイ対象ディレクトリを、create-react-appに合わせて、buildディレクトリに変えるくらいのことだけしてます。

いちおう、bashでのファイルにしたとき(整形したバージョン)も記載しておきます。

```bash
#!/bin/bash

npx create-react-app my-app --scripts-version=react-scripts-ts
cd my-app

expect -c "
spawn firebase init hosting

expect \"Select a default Firebase project\"
send \"\n\"

expect \"What do you want to use as your public directory?\"
send \"build\n\"

expect \"Configure as a single-page app\"
send \"\n\"

interact
"

npm run build
firebase deploy --only hosting
```

注意としては、firebaseはdefaultのプロジェクトを使うようにしているので、気をつけてください。

では、良いクリスマスを！！！
量子情報のための線形代数1[ベクトル空間の導入]

目次の記事、[量子情報のための線形代数](https://qiita.com/adamu-of-FUN/items/0af1254d028686cdee0b)のシリーズ第１回目です。今回は量子情報を学ぶ上で必要なベクトル空間のまとめです。

以下、KをR(実数の集合)またはC(複素数の集合)とする。
ここでは、抽象的な体$K＝R$または$C$上のベクトル空間(線型空間)の導入を行う。

集合$V$が$K$上のベクトル空間であるとは、$V$の元(ベクトル)である$u,v∈V$と$K$の元(スカラー)$a∈K$に対して次の公理を満たす、和$u+v$とスカラー倍である$au$が定義された集合のことをいう。

公理1.1
ベクトル空間$V$は次に条件を満たす集合である。任意の$u,v∈V$に対して和$u+v∈V$が定義されていて、次の条件を満たす。
(1) 結合則：$(u+v)+ w = u + (v + w)$ $(u,v,w ∈V)$
(2) 交換則：$u + v = v + u$ $(u,v ∈V)$
(3) $V$の特別な元0が存在して、$u + 0 = u$ $(u ∈ V)$を満たす。この0を零ベクトルという。
(4) 任意の$u ∈ V$に対して、$u ∈ V$が存在して、$u + v = 0$を満たす。この元$v$を$u$の逆ベクトルといい、$-u$と表す。

また、任意の$u ∈ V$や$a ∈ K$に対して、スカラー倍$au ∈ V$
が定義されていて、次を満たす。
分配則：
(5)$a(u + v) = au + av$ $(a∈K, u,v∈V)$
(6)$(a + b)u = au + bu$ $(a,b∈K, u∈V)$

(7) 結合則：$(ab)u = a(bu)$ $(a,b∈K, u∈V)$
(8) 単位元：$1u = u$ $(u∈V)$
ただし、1は$K$の積に関する単位元である。

ベクトル空間においては、その構造を考える上で、同じ構造を持つ集合がある場合を考えてみる。

定義1.2
$V$をベクトル空間として、 $V$における空でない$W$という部分集合が$V$の演算のもとでベクトル空間となるとき、$W$を$V$の部分空間という。

この場合、$V$は最大の部分空間ともいい、${0}$の場合は$V$の最小部分空間である。

実際では、次のような命題が知られている。

命題1.3
$V$をベクトル空間とする。$V$の部分集合$W$が次の条件(1)~(3)を満たすならば、$W$は$V$の部分空間である。
(1) $V$の零ベクトルは$W$の含まれる
(2) $W$の任意の元$u,v∈W$に対して、$U+v∈W$が成立する
(3) $W$の任意の元$u$と任意の$a∈K$に対して、$au∈W$が成立する

最後に、線形代数の教科書に見られる部分空間の表記について述べておく。
$V$の任意の部分集合S(必ずしも部分空間ではない)に対して、Sを含む最小の部分空間をsが張る部分空間といい、Span(S)と表す。
※この場合はベクトルが張る空間(Spanning Space)としている。

今回は以上です。次回は、Diracのブラケット記法や線型独立・従属について書く予定です。
PWAでホーム画面に追加するアイコンをランダムにしてみた

この記事は[PWA Advent Calendar 2018](https://qiita.com/advent-calendar/2018/pwa)の記事です。

## 実現したいこと
PWAとして、ホーム画面にアイコンを追加する際、自分の好きなアイコンが設定できたり、ランダムにアイコンが設定できるようにしたい。

## どんな場面で使う？
先日、 [よめなう！](https://yomenow.me)というサービスをリリースしました。
リリース記事：https://qiita.com/minakawa-daiki/items/add42dfceec54a0583fa

これは、２次元の正妻を記録したり、毎クール変わるアニメの嫁のヒストリを残せるようにしたいというコンセプトのもと作ったサービスなのですが、例えばこういったサービスの時に、正妻に登録した画像をアイコンにしたくないですか？**僕はしたいです**。

また、同じURLで配信しているサービスで、例えばチーム毎にアイコンを変えたいだとか、ゲームだとしたら自分の作ったキャラクタやチームのアイコンが指定できるだとか、色々な場面で使えそうな気はします。

## イメージ
![dia.gif](https://qiita-image-store.s3.amazonaws.com/0/213538/f093a1bb-992c-42d4-41b2-999644e4c296.gif)

## 実装してみた
今回は Ruby on Rails で実装してみました。他のフレームワークでも問題なく実装できる範囲だと思います。

リポジトリ: https://github.com/minakawa-daiki/dynamic-icon-app

### 実行方法

```
touch .env
docker-compose run --rm web bundle
docker-compose run --rm web rails db:create
docker-compose up
```

このアプリは、ランダムで２枚のアイコンが切り替わるようになっています。

### 実装

```config/routes.rb
Rails.application.routes.draw do
  root 'home#index'
  get 'manifest.json', to: 'json#manifest'
end
```

```app/controllers/json_controller.rb
class JsonController < ApplicationController
  def manifest
  end
end
```

```app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="manifest" href="/manifest.json">
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```

```app/views/home/index.html
<h1>Dynamic Icon App</h1>
```

```app/views/json/manifest.json.erb
<% index = rand(2) + 1 %>
{
  "name": "DynamicIconApp",
  "short_name": "DIA",
  "start_url": "/",
  "icons": [
    {
      "src": "icon<%=index %>.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ],
  "theme_color": "#fcd550",
  "background_color": "#ffb919",
  "display": "standalone",
  "orientation": "portrait"
}
```

特に変わった実装はしていなく、`manifest.json.erb`を作成することで、動的に `manifest.json`を作成しているのがミソです。

ここの動的生成する部分を、ログインしているユーザのアイコンにしたりなど、様々なやりようはあると思います。
また、アイコン以外の部分も動的に生成できるので、動的に様々な`manifest.json`が作成可能です。

## おわりに
今回の技術を用いて、[よめなう！](https://yomenow.me)のPWA化を進めていこうと考えています。
また、ネイティブアプリには実現できないような部分がPWAでもできるのが面白さの一つだと思います。
今後のPWAの動きに注目ですね。
シェルスクリプト実行におけるスクリプトの指定

### コマンドラインから実行させる際のスクリプト指定方法

1. 相対パスによるスクリプト指定
2. 絶対パスによるスクリプト指定
3. PATH通しによるスクリプト指定
4. ドットスラッシュ無し相対パスによるスクリプトの指定

※sourceコマンドやshコマンドの引数としてスクリプトを指定する場合は今回割愛します。

下記のように、/home/fooにbar.shが配置されている事を前提に、説明します。

```sh:/home/foo/bar.sh
#!/bin/sh
echo "hello, world"
```

#### 1.相対パスによるスクリプト指定

```sh
$ cd /home/foo
$ ./bar.sh
hello, world
```

冒頭のドットスラッシュ（./ or ../）を基本的に省略してはいけません。その場合、エラーになり実行出来ません。ただし、例外として4.の場合が有ります。カレントディレクトリに依存しますがシンプルです。

#### 2.絶対パスによるスクリプト指定

```
$ /home/foo/bar.sh
hello, world
```

カレントディレクトリに依存しませんが長くなりやすい。

#### 3.PATH通しによるスクリプト指定

まずはPATHを通します。

```shell
$ export PATH=$PATH:/home/foo
```

パス追加を確認します。（パスをリスト表示し、追加パスが末尾に有る事を目視）
※目視しやすくするために、trコマンドで整形しています。

```shell
$ echo $PATH | tr ':' '\n'
```

スクリプト実行します。

```sh
$ bar.sh
hello, world
```

カレントディレクトリに依存しません。
cdやlsのようなコマンドと同様に、何処からでもシンプルに実行出来ます。

#### 4. ドットスラッシュ無し相対パスによるスクリプトの指定

**例外的に、スクリプトがカレントディレクトリの下位に配置されている場合のみ、ドットスラッシュ無しは可能**です。
Railsにおけるアプリディレクトリからbinstubの「bin/rails s」などを叩く場合が、実務例ですね。

```sh
$ cd /home
$ foo/bar.sh
hello, world
```

下記のように、カレントディレクトリ配置のスクリプトに対する場合、ファイルだけを指定するとエラーになり実行出来ません。この場合は1.のやり方、即ちドットスラッシュを付けて指定する必要が有ります。

```sh
$ cd /home/foo
# NG
$ bar.sh 
# OK
$ ./bar.sh
```
#### まとめ

| スクリプト配置 | 1.相対パス | 2.絶対パス | 3.PATH通し | 4.ドットスラッシュ無し相対パス |
|:-------------|:-:|:-:|:-:|:-:|
| カレントディレクトリ | 〇 | 〇 | 〇 | ✖ |
| カレントの下位 | 〇 | 〇 | 〇 | 〇 |
| カレントの上位 | 〇 | 〇 | 〇 | ✖ |
chromebook(C101pa)でpython3を使う。

# はじめに
chromebook(C101pa)を2017年末から使用していました。起動も早いし、バッテリーも長持ちで軽いのでどこにでも持っていけ、なおかつコスパも優れているので大変重宝していたのですが、pythonやrubyなどのプログラミングを行うのには、開発者モード？とかでosをいじる？などのハードルの高さを感じ、クラウド上の開発環境を使っていました。
が、最近ようやく知ったのですが、chromebookでlinuxが標準で使えるようになったとのこと！
早速やってみました！

# やってみたこと、わかったことの概要
- OSを最新化することで(私の場合chromeOS 70でしたが、)簡単にchromebook上でlinux環境(beta版)を利用できることができた
- linux環境にはpython3, gitが標準インストールされている
- pip, jupyter notebookの追加インストールができた
- ファイルはhomeディレクトリがchromeOS側と共有されている

# 実施環境
OSのアップデートを実施したのが2018年12月になってからなので、OSのバージョンはchrome OS 70です。

# 手順
### chromebookの設定でlinux(beta版)を有効化
   OSをアップデートすることで設定画面に「linux(beta版)」が現れ、
”オンにする”を選択すれば完了。他のアプリ同様にlinuxのターミナルが選択できるようになります。
### ターミナルで標準インストールされている物を確認
python3, gitは以下のバージョンがインストールされていました。

```
$ python3 --version
Python 3.5.3
$ git --version
git version 2.11.0
```

### pip, jupyterのインストールを実施。

- pipのインストール

```
$sudo apt-get install python3-pip
```

- jupyterのインストール＆起動

```
$sudo pip3 install jupyter
$jupyter notebook
```
```jupyter notebook```コマンド実行後表示される、```The Jupyter Notebook is running at:```に続くURL(```http://localhost:8888/~```)をchromeに入力して、起動しました。

### chromeOS <=> linux間のファイル共有
linuxの利用をONにすると、chrome側のファイルアプリの左側に「Linuxファイル」が表示されます。ここがlinuxのhomeディレクトリの中身であるため、ファイルの共有も簡単にできます。


# 参考
- [ChromebookでLinuxを動かす。Chrome OS 69でC101PAは完璧なLinuxノートになる。](https://www.xmisao.com/2018/09/02/run-linux-on-chromebooks-using-crostini.html)

# 更新情報
最新のchrome OS 79でも上記コマンド実施　→　問題なし
開発合宿でIoTした

# はじめに
オプトテクノロジーズの伊藤です。
もはや私の投稿はアドカレドリブンなっています。
今回は、毎年恒例となった[開発合宿](https://tech-magazine.opt.ne.jp/entry/2018/12/10/170000)でIoTをテーマにハックをしたのでご紹介します。

# 前談
[前回の投稿](https://qiita.com/yorishigeito/items/c287096d7f6bc6e9506b)では、会議室の利用状況をモニタすべく、デバイスのボタンを押すという極めてアナロジーな方式に着地したわけですが、どうしても会議開始時にボタンを押し忘れる人がいるんですよね…
で、そういう人に限って「カレンダーから勝手に予定が消えた」とか言うんすよ…（メール見ろし）
そんなこともあり、パイロット運用を一時中断し、別の方式を模索してました。

# 開発合宿にあたり
上記の記事にもありますが、開発合宿は複数名がチームを作って同じテーマに取り組むのですが、我々IoTチームのリーダーである @mshibuya 氏がこれまた __シュッとしてバーン__ な人でして、知的好奇心をくすぐるおもちゃをガンガン買うんですね。
そのおもちゃの中に[Raspberry Pi Zero＆カメラ](https://www.amazon.co.jp/dp/B077SPGD42/ref=cm_sw_r_cp_ep_dp_7eVQBb57A61T2)などもあり、カメラで撮影した静止画を画像認識し、会議室の在室を確認することにチャレンジしました。

# アーキテクチャー
* ラズパイに繋いだカメラモジュールによって撮影したJPEGをローカルに保存
* ローカルに保存したJPEGをAmazon S3にアップロード
* Amazon S3にアップロードしたJPEGをAmazon Rekognitionで画像認識＆判定

# 詳細
## ラズパイに繋いだカメラモジュールで撮影したJPEGを保存
カメラを扱う為のライブラリをインストール

```
sudo apt-get update
sudo apt-get install python-picamera
```
以下のコードを実行（解像度は任意）

```take_picture.py
import time
import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    camera.start_preview()
    time.sleep(1)
    camera.capture('room.jpg')
```
## 保存したJPEGをAmazon S3にアップロード
ShellでAWSコマンドを叩く為にライブラリをインストール

```
sudo apt-get install awscli
```
AWS SDK for Pythonをインストール

```
sudo pip install boto3
```
AWSの認証情報を設定

```
aws configure
AWS Access Key ID [None]: <Key ID>
AWS Secret Access Key [None]: <Access Key>
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
以下のコードを実行（S3のバケットは予め作っておきバケット名を指定、ファイル名は上述で保存したもの）

```upload.py
import boto3

s3 = boto3.resource('s3')
s3.Bucket('S3のバケット名').upload_file('room.jpg', 'room.jpg')
```
## Amazon S3にアップロードしたJPEGをAmazon Rekognitionで画像認識＆判定
以下のコードを実行
今回は、Rekognition側で付与されたラベルの内、人間（Human）か人（Person）の信頼度が95%以上で「人がいる」と判定
ラベルと信頼度はいくつかのサンプル画像で試した上で肌感で決定

```rekognition.py
import boto3

client = boto3.client('rekognition')
response = client.detect_labels(Image={'S3Object':{'Bucket':'s3のバケット名','Name':'room.jpg'}})

counter = 0
for label in response['Labels']:
    if (label['Name'] == 'Human' and label['Confidence'] >= 95) \
    or (label['Name'] == 'Person' and label['Confidence'] >= 95):
        counter = 1
        break

if counter > 0
    # 人がいる時の処理
```

# まとめ
* Arduino より Raspberry Pi の方が素早く色々できる（汎用Linuxが載っているので拡張性が高い）
* Amazon Rekognition はそれなりに認識精度が高そう（パイロット運用していないからまだ言い切れはしない）
* 開発合宿では別のメンバーが AWS IoT Core や フロントエンド を担当し、ラズパイ間の通信をMQTTで繋いで、送受信したりした（それはまた別の機会に書くか本投稿をアプデするかも）
* パイロット運用の再開は年明け
Javaでメタプログラミングをしてみた

#はじめに
javassistというメタプログラミングが出来るライブラリを使用して
実際に作成したクラスを書き換えてみました。

ライブラリを使っていてクソだと思った時に使えます。
(謎のログが出力されるなど...)

#ライブラリをインポート
gradleを使用しています。

```gradle:build.gradle
...
dependencies {
...
    compile group: 'org.javassist', name: 'javassist', version: '3.15.0-GA'
}
```

#実際に書き換える
実際にUserという用意したクラスを書き換えて、
moneyというフィールドを追加します。

```java:data/User.java
package data;

public class User {
    private String name;

    private int age;

    private float height;
    private float width;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public String getUserInfo() {
        return "name: " + name + ", age: " + age;
    }
}
```

```java:Main.java
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtMethod;
import javassist.Modifier;

public class Test {
    public static void main(String[] args) {
        try {
            // 全てのクラスのプールを取得。
            ClassPool pool = ClassPool.getDefault();

            // パッケージ名とクラス名のフルで data.User を検索
            // 見つからない場合は例外が出ます。
            CtClass ctc = pool.get("data.User");

            // 引数にフィールドの型、フィールド名、宣言先を指定。
            CtField field = new CtField(CtClass.intType, "money", ctc);

            // フィールドの修飾子を指定
            // 複数の修飾子がある場合は | で追加していく。
            // field.setModifiers(Modifier.STATIC | Modifier.PRIVATE);
            field.setModifiers(Modifier.PRIVATE);

            // フィールドを追加。
            ctc.addField(field);

            // 定義されているメソッドを取得。
            CtMethod method = ctc.getDeclaredMethod("getUserInfo");
            // メソッドの中を置き換えて money が出力されるように変更。
            method.setBody("return \"name: \" + name + \", age: \" + age + \", money: \" + money;");

            // クラスローダーのクラスを上書き。
            Class cls = ctc.toClass(ClassLoader.getSystemClassLoader(), AsmTest.class.getProtectionDomain());

            // リフレクションでクラスをインスタンスを生成。
            User ins = (User) cls.newInstance();
            ins.setName("Bob");// name にBobを指定。

            // コンパイル後に money が追加されているのでリフレクションで取得。
            Field f = cls.getDeclaredField("money");

            // アクセシビリティを変更。
            // private や protectedの場合にはアクセスできるように true にしてください。
            f.setAccessible(true);

            // moneyフィールドを int で 1500 に変更。
            f.setInt(ins, 1500);

            // 実際に出力。
            System.out.println("name: " + ins.getName());
            System.out.println("money: " + f.getInt(ins));
            System.out.println(ins.getUserInfo());
        } catch (Exception e) {
            // エラーを出力。
            System.out.println(e);
        }
    }
}
```

#実行すると
結果は...

```
name: Bob
money: 1500
name: Bob, age: 0, money: 1500
```

なんと、moneyというフィールドが増えていて、
値を変更することが出来るようになっています。

#まとめ
今回のフィールドの追加のみ紹介しましたが他にも様々な機能があるので
是非使って見てください。

javassist
https://github.com/jboss-javassist/javassist
eom/bookの日本語版を作り始めた

これは[数値計算Advent Calendar](https://qiita.com/advent-calendar/2018/numerical_analysis)23日目の記事です！クリスマスまでもう少しですね。

私は以前の記事

- [硬い微分方程式を解く](https://qiita.com/termoshtt/items/48788da8ee0994bbfaa0)

でも紹介した[eom](https://gitlab.com/termoshtt/eom)というRustのライブラリを作っています。このライブラリは

- 常微分方程式、偏微分方程式（スペクトル法）の計算
- 力学系解析（リアプノフ指数、共変リアプノフベクトル）の計算

のためのライブラリです。
このライブラリは私の作ってる他のRustのライブラリに比べて数学的な側面が強いので、`cargo doc`で生成されるライブラリとしてのリファレンスに加えて、数学的な側面を補足するbookを作っています。今回はAdCのためにこの日本語版を新たに書き始めました（できたとは言っていない）。

- [eom book/ja](https://termoshtt.gitlab.io/eom/book_ja)

数値計算の内容はbookを見てもらうとして、この記事ではせっかくなのでbookの作り方と管理方法についてまとめます。

mdbook
-------
先程からbookと言ってるのは「本」と呼ぶと個人的な違和感が強いからですが、プログラミング関係のコミュニティではHTMLで生成されたまとまったドキュメントのことをbookと呼ぶ事が最近は多いように感じます。
eom bookではこのようなbookを生成するためのツールとして[mdbook](https://github.com/rust-lang-nursery/mdBook)を使っています。

- [rust-lang-nursery/mdBook - Create book from markdown files. Like Gitbook but implemented in Rust](https://github.com/rust-lang-nursery/mdBook)

mdbookの説明中にもあるようにこのようにMarkdownからbookを作るツールとしてはGitbookが有名なようですね（使ったこと無い)。mdbookはRust製で公式のリポジトリで開発されていることもあり、Rust製ツールでは良く使われています。

### Install
他のRust製ツールと同様に

```
cargo install mdbook
```

で入ります。依存しているプロジェクトが多いのでビルドにはちょっと時間がかかります…これで`$HOME/.cargo/bin/mdbook`に実行ファイルがインストールされるはずです。

### 設定
mdbookの設定はTOMLを使って記述します

```toml:book.toml
[book]
authors = ["Toshiki Teramura"]
src = "src"
title = "eom"

[output.html]
mathjax-support = true
```

概ね設定は名前の通りですが、設定でMathJaxを有効にすることができます。
ただし数式を出力するにはMarkdownからHTMLに変換した上でHTML内に埋め込まれている数式をMathJaxがレンダリングするため、エスケープが少しややこしい事になります。

```markdown
ここで\\(x_n \in \mathbb{R}^N \\)はN次元のベクトル
```

インラインの数式はこの様な感じになります。MathJaxなのでLaTeXの命令もある程度使えます。Displayモードの時はこんな感じ：

```markdown
\\[
\begin{align}
  \frac{dx}{dt} &= -p x + py \\\\
  \frac{dy}{dt} &= -xz + rx -y \\\\
  \frac{dz}{dt} &= xy - bz
\end{align}
\\]
```

`align`環境も使えますが、改行が`\`をそれぞれエスケープしないといけないので4文字になってます（いまいちルールが分かりきってない）

### Build

```
mdbook build
```

とするとbook.tomlに従ってHTMLを含むディレクトリ`book/`を作ってくれます。また、

```
mdbook serve
```

とするとHTTPサーバーを起動した上で`src/`以下を監視してファイルが更新される毎にHTMLを再生成してくれます（便利）。

GitLab Pages
-------------
ビルドされたbookはGitLab Pagesにアップロードされています。
GitLab Pagesは静的なサイトを公開する事ができるサービスで、GitLabのリポジトリに紐づいています。
例えば`gitlab.com/termoshtt/eom`のリポジトリのGitLab Pagesは`http://termoshtt.gitlab.com/eom`に公開されます。

### GitLab CI
使い方はGitLab自体でCIを管理してくれているのでGitHub Pages等より特に認証周りが簡単で、CIに`pages`というJobを追加すると、`public/`ディレクトリを自動的に公開してくれます。
GitLab CI自体DockerコンテナベースのCIサービスで、GitLabは[gitlab.com](gitlab.com)に無料でリポジトリを作れますが、同時にCIも無料で使えます。オンプレ環境にGitLabを入れて使っている場合も同様です。

最後に
-----
本当はデータ同化のライブラリ[da.rs](https://gitlab.com/termoshtt/da.rs)の日本語版も含めて公開する予定だったのですが、そもそもライブラリの実装状況も含めて進捗ダメでした。
Apache Cassandraのインストール

やってみたのでメモ

# 前提条件
- CentOS7
- Java8インストール済み

# 手順
1. リポジトリ情報を登録する

    ```
    # vi /etc/yum.repos.d/cassandra.repo
    ```
    
    ```cassandra.repo
    [cassandra]
    name=Apache Cassandra
    baseurl=https://www.apache.org/dist/cassandra/redhat/311x/
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://www.apache.org/dist/cassandra/KEYS
    ```

2. yumでインストールする

    ```
    # yum -y install cassandra
    ```

3. 再読み込みする

    ```
    # systemctl daemon-reload
    ```

4. 起動する

    ```
    # systemctl start cassandra
    ```

# 参考
- [公式ドキュメント - Installing Cassandra](http://cassandra.apache.org/doc/latest/getting_started/installing.html)
- [公式ドキュメント - Installation from RPM packages](http://cassandra.apache.org/download/)
りんごを使ったライフハック

# はじめに
この記事は[LIFULL その2 Advent Calendar2018](https://qiita.com/advent-calendar/2018/lifull2)の19日目の記事です。
ボーナスが入ることを見越してりんごを買ったのですが、どうせだし面白いことをやろうと思って、やってみた内容です。

# りんごとは
りんごとはAppleWatchのことです（以降は「りんご」に統一します）。
ちなみに、りんごは通知が来た時に手首に振動が来るので、通知を忘れることがないので地味に助かっています。

# やったこと
りんごで操作して、やることをTogglに登録するアプリを作成しました。
<img width="872" alt="Screen Shot 2018-12-24 at 0.17.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/61802/3bc90ad3-c85a-4487-d360-9e2635cc50f8.png">

また、このアプリの目玉機能として、やることの内容が **ランダム** に決められます。
自分でやることを決めてりんごを操作するのではなく、やることをりんごに決めてもらって自分がそれに合わせるスタイルを取ります。
家に帰ると自制して勉強や家事をやらずに、ずっとYoutubeを見てしまう僕にはぴったりの機能となっています。

# やってみて
このアプリに合わせて生活することで、`[自由時間, 家事, 筋トレ, 勉強]` が同じ時間ずつ行われるはずです。
あえてリッチな機能をつけずに使用することでシンプルに保っています。
このアプリで生活が改善されると思うので、使用し続けてみようと思います。



# 真面目な話
機能やアプリについては **ネタ** です。
iOS,watchOSのアプリどころかSwiftも書いたことなかったのでやりたいことが実現するのに時間が足りなかっただけです。

AppleWatchは常に腕につけているので、iPhoneよりもすぐに操作できるという利点があります。
その利点を生かして、これからやるタスクをAppleWatch上で操作するというのが元々やりたいことでした。
しかしアドベントカレンダーの期日と、自分の習熟度の兼ね合いで機能を削ることにしました。

最初から綺麗にしすぎようとしたり、機能を盛り込みすぎると何も進まないので、最初は小さく始めるのが大事だと思います。

## やったこと
まずはやることを洗い出しました。
* Togglのtime_entry APIを使用する
* ボタンを押すとタスクを登録するように実装する

Swiftを一切書いたことがなかったため、いきなりiOSのプロジェクトを作成して実装を始めるとデバッグに時間がかかりそうだったので、cliアプリケーションの形式から実装をはじめました。
cliからTogglへデータをPOSTし、タスクが登録されるところまでをまず作りました。
その後iOSプロジェクトを作成し、StoryBoardなるものでbuttonを配置し、ハンドラ内で、cliで使っていた関数を使用するように実装しました。


## iOS/watchOSアプリを書いてみて
XCodeの補完が便利で非常に書きやすかったです。
また、XCode内でほぼ全てが完結していて、見た目に反映されるので、初学者にも実は優しいのではないかと思いました。（普段Webを触っている自分には、動きが違いすぎて慣れるのには時間がかかりそうですが）


# まとめ
- 小さい箇所からちょっとずつ作ろう
- 触ったことない言語でも作ってみたら意外となんとかなる

自分用ツール作りたい場合は、iOSアプリとして作ったほうが楽に作れることもありそうですね。
AWS SDK for RubyでMFA認証とAssumeRole

さまざまな事情で、IAM Roleを介してリソース操作が必要になることがあると思います。その際にMFA認証必須のIAM Roleのクレデンシャルを取得しリソースへアクセスする際の書き方です。

# credentials

AWSのcredentialsは下記のように設定されていると仮定します。
リージョンは例として`ap-northeast-1`としていますが、適宜使用しているリージョンに置き換えてください。

access_keyやsecrete_access_keyの取得方法はここでは説明しません。

```
~/.aws/credentials
[hoge]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

# Aws::STS::Client
AWS Security Token Service(STS)を使用して一時的セキュリティ認証情報を作成し、AssumeRoleを行います
[https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/STS/Client.html#assume_role-instance_method](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/STS/Client.html#assume_role-instance_method)

`~/.aws / credentials`に定義している共有資格情報ファイルから資格情報をロードするときはprofileオプションを使います。

```Ruby
sts_client = Aws::STS::Client.new(profile: hoge, region: 'ap-northeast-1')
```
## Aws::AssumeRoleCredentials
AssumeRoleCredentialsを用いて、AssumeRoleを行いロールのcredentialを取得します。
[https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/AssumeRoleCredentials.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/AssumeRoleCredentials.html)
MFA認証を設定している場合は`serial_number`にMFAデバイスのARN、`token_code`にMFAコード(6桁)を設定する必要があります。
MFAコードは定期的に変わるため、実行時に引数で与えるようにするなど工夫が必要です。

```Ruby
sts_client = Aws::STS::Client.new(profile: 'hoge', region: 'ap-northeast-1')
role_credentials = Aws::AssumeRoleCredentials.new( client: sts_client, role_arn: ロールのARN, role_session_name: ロールのセッション名(任意の名前), serial_number: MFAデバイスのARN, token_code: MFAコード)
```

AssumeRoleCredentialsで取得したcredentialを元にAWSリソースを扱います。

```Ruby
# 作成したロールのcredentialでリソースにアクセス
Aws::S3::Resource.new(region: 'ap-northeast-1', credentials: role_credentials)
```


# 参考

[https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html)
[https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/STS.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/STS.html)
[https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/AssumeRoleCredentials.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/AssumeRoleCredentials.html)
[https://dev.classmethod.jp/cloud/aws/aws-cli-supports-assume-role-credentials-provider-and-mfa/](https://dev.classmethod.jp/cloud/aws/aws-cli-supports-assume-role-credentials-provider-and-mfa/)
Python + Django でExcelをダウンロードする

Python + Django でExcelをダウンロードしてみます。「openpyxl」というパッケージを使います。

「openpyxl」の使い方は、[Python openpyxlでExcelを操作](https://qiita.com/tftf/items/07e4332293c2c59799d1)の投稿を参照するなどするとよいと思います。

ここでは、Djnagoを使ってExcelをダウンロードする方法を投稿します。


##1.環境

| カテゴリ       | バージョンなど       |
|:-----------------|------------------:|
| os               |windows 10 home 64bit | 
| python           |            3.6.5 |
| django             |              2.1.4|
| project             | myproject|
| openpyxl           |   2.5.12|


##2.パッケージをインストール

以下のコマンドを実行します。

```command.prompt
pip install openpyxl
```

##3.アプリケーションの作成

「python manage.py startapp excelapp1」で以下のファイルができます。

```
excelapp1
│  admin.py
│  apps.py
│  models.py
│  tests.py
│  urls.py
│  views.py
```

""4.仕様

テンプレートファイル
フォルダ名：「C:\data\python\exceltemplates」
ファイル名；sample.xlsx
内容：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/49fde2c1-c4bf-9ddf-ceac-fc9e78bc86fc.png)


このファイルの２行目を編集してクライアントにダウンロードするようにします。

##5.urls.py

```excelapp1/urls.py
from django.urls import path
from . import views

app_name = 'excelapp1'
urlpatterns = [
    path('', views.index, name='index'),   # 一覧
]
```

##6.views.py

```excelapp1/views.py
from django.shortcuts import render
import os
import openpyxl
import pprint
from django.http import HttpResponse

def index(request):
    """
      Excel output from template
    """
    # Excelのテンプレートファイルの読み込み
    wb = openpyxl.load_workbook('C:/data/python/exceltemplates/sample.xlsx')

    sheet = wb['sheet1']
    sheet['C2'] = 'XXX'
    sheet['E2'] = 'new'

# Excelを返すためにcontent_typeに「application/vnd.ms-excel」をセットします。

    response = HttpResponse(content_type='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; filename=%s' % 'report.xlsx'

    # データの書き込みを行なったExcelファイルを保存する
    wb.save(response)

    # 生成したHttpResponseをreturnする
    return response

```

##7.プロジェクトにアプリを追加

myprojectのsettings.py,urls.pyをそれぞれ編集します。

```myproject\settings.py
INSTALLED_APPS = [
#・・・
   'excelapp1', #追加
]
```

```myproject\urls.py
urlpatterns = [
#・・・
    path('excelapp1/', include('excelapp1.urls')),   # ←ここを追加    
    path('admin/', admin.site.urls),
]
```

##8.確認

URLにアクセスする
http://localhost:8000/excelapp1

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/36f27bff-a6ad-de34-e77a-addba1b029b3.png)

Excelも無事ダウンロードできました。
Salesforce Migration Tool(Ant移行ツール)のインストール方法について(Mac)

Salesforceの主にCore機能で使用するMigration Tool(通称Ant移行ツール)をMacで導入する方法を簡単に整理します。

1. [https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)からJava SE 8をインストールします。
2. [http://ant.apache.org/](http://ant.apache.org/)からバージョン1.6以降で適当に選んでローカルにzipをダウンロードして解凍します。
3. 解凍したフォルダを/usr/local/bin/に移動します。
    * コマンド：mv apache-ant-1.10.5 /usr/local/bin/
4. 起動時にPATHを通すようにするために、.bash_profileに下記を追記します。
    * コマンド：vi ~/.bash_profile 
    * 追記内容：
        * ANT_HOME=/usr/local/bin/apache-ant-1.10.5
        * export PATH=\$ANT_HOME/bin:$PATH
5. 即時反映させます。
    * コマンド：source ~/.bash_profile
6. ant -versionで正しくコンパイルが成功していることを確認します。
    * Apache Ant(TM) version 1.10.5 compiled on July 10 2018
7. [Summer '18 Ant 移行ツールの .zip ファイルをダウンロードします。](https://gs0.salesforce.com/dwnld/SfdcAnt/salesforce_ant_43.0.zip)(その時の最新のフォルダをインストールします。)
8. Ant移行ツールは、ダウンロードしたフォルダの中にあるant-salesforce.jarが本体なので、これをAntlibディレクトリにコピーします。(最新版のツールに置き換える場合は、このjarを入れ替えます。)
    * コマンド：cp ~/Downloads/salesforce_ant_43.0/ant-salesforce.jar /usr/local/bin/apache-ant-1.10.5/lib/

次回は、具体的な使用方法をまとめたいと思います。

[参照]
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_deploying_ant.htm
【小ネタ】Eixirのパイプ演算子使用中に第一引数の値を第二引数に渡す方法


この記事は[fukuoka.ex Elixir/Phoenix Advent Calendar 2018](https://qiita.com/advent-calendar/2018/fukuokaex) 23日目の記事です。

こんにちは！Elixir学習中、業務では主に手動のテストをやっているyoshitakeです。
今回はAdvent Calendarの記事として、Elixirを学んで勉強中に知った小技を紹介します。

## Elixirのパイプ演算子

僕が参考にしている、 @piacere_ex さんの[Excelから関数型言語マスター1回目：データ行の”並べ替え”と”絞り込み” - Qiita](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1)にもサラッと書かれていますが、Elixirにはパイプ演算子というものがあります。
これは、`|>`でつなぐと、左側に記述した変数や関数の出力が、右側に書かれた関数の第一引数になる。
というものです。

簡単にパイプ演算子を使った例を紹介します。

```Elixir
def mul(a, b)do
  a * b
end

def div(c, d)do
  c / d
end
```

上記のように、2つの数値の掛け算・割り算を行う関数mul, divがそれぞれあったとします。
この関数を使って、 `(5 × 4) / 10` を計算しその結果を表示する場合、パイプ演算子あり、なしではそれぞれ以下のようになります。

```Elixir
# パイプ演算子なし
IO.puts div(mul(5, 4), 10)

# パイプ演算子あり
mul(5,4)
|> div(10)
|> IO.puts
```

このパイプ演算子のおかげでデータの流れや変化がわかりやすい、というのが個人的な感想です。
直感的でわかりやすいなぁ…と思います。

しかし、このパイプ演算子は **次の関数の第一引数**としてデータを渡すので、第一引数以外の引数にデータを渡す場合はちょっと工夫が必要とのことです。
そこでこの記事では、私が教えてもらった3通りのやり方を紹介します。

## パイプ演算子で第一引数以外にデータを渡す方法

以下の3つの方法があるそうです。

1. swapする関数を作る
1. 匿名関数（無名関数）を使う
1. 匿名関数（無名関数） + 省略記法(ショートハンド)を使う

先程の例 `div(c,d)`に対して `c/d`ではなく、`d/c`をしたい、という処理について考えてみます。

### 1. swapする関数をつくる

```Elixir
def swap_div(c, d)
  d / c
end

mul(5,4)
|> swap_div(10)
|> IO.puts

```
こんな感じです。
第一引数でもらうという事象は変更できないので、関数の中で順番を変更するですね。

### 2. 匿名関数（無名関数）を使う

```Elixir
mul(5, 4)
|> (fn n -> 10 /n end).()
|> IO.puts
```

Elixirには匿名関数（無名関数）をパイプ演算中に記述することができます。
それを記述し、その中で第一引数を他の処理に配置したコードを書いたらOKです。
■ 参考
[関数 · Elixir School](https://elixirschool.com/ja/lessons/basics/functions/)

### 3.  匿名関数（無名関数） + 省略記法を使う


```Elixir
mul(5, 4)
|> (&div(10, &1)).()
|> IO.puts
```
Elixirの匿名関数には省略記法があるそうで、省略記法を使うと第一引数を`&1`第二引数を`&2`という感じで使えるようになるそうです。

■ 参考
[関数 · Elixir School](https://elixirschool.com/ja/lessons/basics/functions/)


## おわりに
さて、Elixir勉強中に習った小技を紹介しました。
これがなんの役に立ったのか？というと、`Regex`（正規表現）を使っているときに役立ちました。
Regexをパイプ中に使ってたのですが、データを第二引数に渡したい！と思ったんですよね。
それについてはまたの機会に。
では、ここまで読んでいただきありがとうございました！

※ 他にも方法ある場合教えていただけると嬉しいです。
よろしくお願いします。
■ 参考
[Regex – Elixir v1.7.4](https://hexdocs.pm/elixir/Regex.html)
ほとんど何も知らない人たちにCloud Nativeの話をしてみた。

これは、社内のある部署からの要望で「**コンテナ、Docker、Kubernetesの勉強会をしてほしい**」というリクエストが来た時の出来事である。

その部署はエンジニアが（たぶん）中心の部だろうから、ゴール設定はどこにおくか？ときいたら

>「DockerやKubernetesの構築・運用・保守ができるようになりたい、そのための第一歩としたい」

ということだった。
ちょうど、[Japan Container Days v18.12](https://containerdays.jp/) が実施されている真っ最中にダブルブッキングしてしまったのだが、まぁある意味ちょうど新しい情報も盛り込めるのでよかったとして、コンテンツをリアルタイムにアップデートして実施してみた。

Agendaは以下のように

1. 今まさに熱いイベント（JCD v18.12）が開催されている事
2. 自分もMeetupで発表した事
3. 来年度から「Cloud Native Days」にリブランドされる事
4. KubeCon＆CloudNativeConの参加者状況
5. CloudNativeの定義（CNCFより）
6. CloudNativeの技術としてのアプローチ
7. 仮想化からクラウド・ネイティブへの道のり（[Zenbutsuさんの図](![image.png](https://qiita-image-store.s3.amazonaws.com/0/75458/93b03a4f-03c3-303d-93f6-f65ed2130013.png)
)を引用）
8. 国内状況
9. 国外状況
10. 技術活用のレベル（ピラミッド：筆者のイメージ）
11. 理解の早道として、土台となる「Kubernetes」
12. Kubernetes = Linux of the Cloud（をイメージで少しわかりやすく）
13. よく四の五の文句いうやつに対しての提言
14. Kubernetes を身に着けるためのステップ
15. プロダクトベースの情報
16. JCD v18.12のパネルディスカッションから来年や2020年に向けての未来予想
17. [showKs](http://showks.containerdays.jp) を紹介

始める前に、とりあえずアンケート。

**「Docker , Kubernetes を知ってる or 使ったことある人？」**

と聞いたら、手が上がったのは**20～25名くらいの中で1、2名**。（ほんとはここの部署、ある理由からこの勉強会をした時点でこんな状況はあり得ないんです細かくいいませんけど・・・）

とくにここでは強く話をしたのは、8,9,10,13,14のところです。社内での技術啓蒙する中ではかなり強めに刺激を与えている身でありますので、ここも自社のエンジニアにカツを入れる意味で提言・提案をしておきました。

ここでは特に、このアドベントカレンダーのテーマである「Kubernetes」を扱うエンジニアのみなさんに気になるのは**14.**
ではないでしょうか。
私個人の経験と知識、SIerの中で啓蒙してきた実績を踏まえて今のところ以下のようにステップを提示しました。

1. OSをちゃんと理解（普通にAdministration + Kernel）
2. Computing , Networking , Storage , DB , Protocol理解
3. （コンテナ技術を理解）
4. Infrastructure as Code : 要は手っ取り早く、少なくともYAML
5. 疎結合・PubSub
6. Kubernetes を理解
7. Kubernetes エコシステム理解

ちょっと補足すると、何がコンテナを難しくさせるって、たぶん多くの人が、1、2、の基礎が足りてなさすぎるということだとおもう。あまりにも希薄、そしてムラがあり、軽視している。Administrationと書いてしまっているが、ここにはいわゆるバックアップ、運用監視、パフォーマンス、可用性、セキュリティ、ユーザー管理（何かどっかの試験項目のようになってるが）の基本は少なくともおさえていないと話にならない・・・と個人的には思う。3、がかっこされているのはここはある意味1、2、がおさえられていれば、「**仕組みはこうです**」と聞いたら「**あーそうか、なるほど**」となれればいいのでかっこなのです。

・・・という感じで「Kubernetesが難しい」と一般に言われちゃってるのは、どうしたって上記の１、２、がちゃんと身についていない輩が多いからそういう印象になるわけで、これらがどういう形であれキチンと理解されていれば難しいというよりも、ただただ「Kubernetesよくできてる、すげー」って思う人、それが今のトッププレイヤー達なのだと感じてます。

# 参考
## 10. 技術活用のレベル
![p.PNG](https://qiita-image-store.s3.amazonaws.com/0/75458/5230091f-6190-f17f-555a-823b5153e482.png)

## 12. Kubernetes = Linux of the Cloud
![c.PNG](https://qiita-image-store.s3.amazonaws.com/0/75458/9c145c7f-08fc-1b84-c87e-59a1a2f908b1.png)
PHPMDの CouplingBetweenObjects でカウントされるのは "::" と "new" だけ


https://phpmd.org/rules/design.html#couplingbetweenobjects

このルールは依存するクラスが多すぎないかチェックしてくれるルールなんですが、このルールに引っかかったときにメンバーにもってたインスタンスを別クラスにまとめたりしても依存クラス数がへらなかったり、どうやって依存クラス数を算出してるかナゾでした。

静的解析なので実際に実行して依存状態をみてるわけじゃなく、結構単純な記述をみて依存を判定してるようです。

# カウントその1. ```::```があったら依存してるクラスにカウント

CakePHP2だったら下記のようなコードよくつかいますよね。

```php
$id = Hash::get($data, 'User.id');
```

これでHashクラスに依存で1カウント。

```php
App::uses('Foo', 'Utility');
```

これもApp利用で1カウント。

あとクラス名を渡すために ```::class``` をつかっても1カウント（これつかうときはDIコンテナとかでインスタンス取得することが多いと思うので間違いではないけど）

```php
$userClass = $this->container->get(User::class);
```

クラス定数の参照も1カウント

```php
if (Foo::DEFAULT_KEY) {
 // なんかのコード
}

```

# カウントその2. new してる

まぁ当たり前っちゃ当たり前ですがちゃんと依存クラスとしてカウントされます。

CakePHP2のコントローラで BadRequestException, InternalErrorException, ForbiddenException, NotFoundException あたりを使い分けて返してるとそれで4カウント^^;

# カウントその3. 型宣言

タイプヒンティングもカウントされるようです。

```php
private function foo(User $user){
	// なんかのコード
}
```

# カウントされないもの

逆にカウントされないのは、その他全部といってよさそう。下記コードなら実際には3つのクラスに依存してるけどカウントされるのは ClassRegistory分だけ。

```php
$userModel = ClassRegistory::init('User');
$postModel = ClassRegistory::init('Post');
$userModel->find(...);
$postModel->find(...);
```

```->``` があったら何かしらのクラスに依存してると判定されるかと思ったんですが、これは全くカウントされてないようです。
Androidアプリケーション開発初心者のメモ

## 概要

自分用のメモ（下書きが10件までだったので仕方なく公開した）

随時更新予定

## 知ったこと一覧

- 基本方針としてGoogleに従う（[Android Developers](https://developer.android.com/?hl=ja)）

- 言語はJavaではなくKotlin（最新バージョン）を使う
- エディタはAndroid Studio（最新バージョン）を使う
- ビルドツールはGradle（最新バージョン）を使う
- importにワイルドカードは使わない
- Android Studioの設定でimportが複数あったときでもワイルドカードを使わないようにする
- Android Studioの設定で未使用のimportがあったとき自動削除する
- リリースはapkではなくaab(Android App Bundle)で行う
- 課金含むテスト環境はGoogle Play Consoleで内部テスト版トラックを使う
- 課金含まないテスト環境はDeploy Gateを使ってもいい

## 参考にした記事など

- [mixi-inc/AndroidTraining: Training course repository for android app development](https://github.com/mixi-inc/AndroidTraining)
メールアドレスの正規表現

Railsチュートリアルで出てきた正規表現のメモです。

emailのバリデーション。

```
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
```

上記の正規表現の意味がこちら。

| 正規表現　　　         |   意味　　　　　　　　　　　　　　　　　　　　　　　　 |
|:-----------------|:------------------|
| /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i    |          (完全な正規表現) |
| /           |            正規表現の開始を示す |   
| \A             |            文字列の先頭 |   
| [\w+\-.]+             |    英数字、アンダースコア (_)、プラス (+)、ハイフン (-)、ドット (.) のいずれかを少なくとも1文字以上繰り返す |   
| @             |             アットマーク |   
| [a-z\d\-.]+          |           英小文字、数字、ハイフン、ドットのいずれかを少なくとも1文字以上繰り返す |   
|\.|ドット|
|[a-z]+|英小文字を少なくとも1文字以上繰り返す|
|\z|文字列の末尾|
|/|正規表現の終わりを示す|
|i|大文字小文字を無視するオプション|


参考：[Railsチュートリアル](https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-creating_user_objects)
数字で見るre:Invent2018


[AWS re:invent 2018 Advent Calendar](https://adventar.org/calendars/2976) 23日目の記事です！

今回のre:Inventは2年ぶり2回目の参加となりました
数字でre:Inventを振り返ってみたいと思います

***

# 22,020

***
飛行距離はなんと！ ***約 22,020 km***
諸事情で行きのトランジットも3回とかなりの長旅となりました、、笑
[往路]
約1,550km 羽田ー那覇
約790km  那覇ー上海
約10,410Km 上海ーロサンゼルス
約380Km ロサンゼルスーマッカラン

[復路]
約670Km マッカランーサンフランシスコ
約8,220Km サンフランシスコー成田

***

# 15,466

***
re:Invent期間中の平均歩数 ***15,466***
多い時で1日 ***30,000*** 歩を超えた日もありました！笑
![DC5CEF3D-75F7-45FF-9036-5B2A11A7C3B3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/325518/9f887586-d6be-e09c-e136-339a81eb5c74.jpeg)

普段の生活では平均8,000歩ほどなので、かなり歩いてることがお分かりいただけるかと。
会場が広く、朝早くから遅くまでやっているので、歩きやすい靴を履いていくのを全力でおすすめします！

***

# 105

***

DeepRacerのワークショップで自分でモデルを作り、実際に会場で走らせた記録が ***105秒（1分45秒）*** でした。
なかなかスピードの調整が難しく、モデル通りに走ってくれませんでした、、
![52D0C934-8500-496F-9C6E-42C733B9D0C9.jpeg](https://qiita-image-store.s3.amazonaws.com/0/325518/588d862f-d8e4-5474-ec40-6a80a43ca297.jpeg)

***

そしてなんと！ワークショップを受けたらDeepRacerがもらえたので自宅でリベンジしてみようかと思います！！
![4DE54C0E-751A-49CA-8747-F2FC058D2D17.jpeg](https://qiita-image-store.s3.amazonaws.com/0/325518/1120e378-5ebc-936d-c8b6-1e0f8e658c17.jpeg)

日本での販売はもう少し先になるようですが、400ドルで買えるみたいですよ

ちなみに1位の方の記録は19秒70。
全然比にならない速さ、、一体どうやったらそんな記録が出るのか。

re:InventのDeepRacer Leagueの結果はこちらから見れますよ！
https://d122dgzab07t8e.cloudfront.net/bigscreen.html

***

# 28

***

今回のre:InventではEXPOのAWSブースの中にAWS User Group Boothを設け、 ***28ヶ国*** のUGリーダーがブースに立ってUGの紹介を行ってました。
私も2時間程度ブースのお手伝いをしてきました！
日本のUGについて、支部が50くらいあるよって説明したとき
fifteen？って聞かれて
いや、fiftyだよ！って
その数の多さにびっくりしてました笑

ほんとは英語でいろいろ説明してあげなくちゃいけなかったんだけど、わたしの英語力不足で他のメンバーにめっちゃ助けてもらいました。。ほんとにありがとうございました！！！

***

# まとめ

***

各国のUGメンバーと知り合う機会も増えてきたので、来年は英語力をあげるのが一番の目標です！！
また今回もたくさんの新サービスが発表されたので、色々試して今後記事にしたいと思いますのでお楽しみに！
開発責任者として中途入社した時にやったこと

この記事は、[Engineering Manager vol.2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/em2) 24日目向けに書きました。

去年10月に現職に開発責任者として入社しました。最近、周りでも開発責任者として転職する人がちらほらいて、入社時にどんなことを考えて何をしたのか聞かれることがあり、会社の規模、事業、メンバーや抱えている課題によって実践する内容は異なると思いますが、私がやったことをまとめました。

# 責任者として入社するということ

エンジニアに限った話ではないですが、責任者として採用されるケースは

- 事業や組織をスケールさせる
- 組織や仕組みの抜本的な改善

など会社が変化していくタイミングで経験値を期待され採用されることが多いかと思います。

個人の成果ではなく組織の成果として評価されるレイヤーで、事業や既存組織にあるルール、メンバーの特性など本来であれば時間をかけて理解し成果に繋げる必要がありますが、早急な成果が求められます。短期間である程度見える形で成果を出すことが重要だと考えています。
それだけではなく、出来上がった組織の長になるので、期待値も高く、常に評価され、時には変化への反発の可能性もあり、難易度としては非常に高いと考えています。

# 入社を決める前に確認したこと

難しいポジションかつ自分のやれることは限られているので、具体的にどんな成果を求めているかなどを確認しました。ポジンションに関わらずこのミスマッチがあるとお互い辛いです。
具体的な話を進める上で、Mission、Visionに共感し、事業へ貢献したいことは大前提でお話をさせて頂きましたし、幸いにもオフィスでの面談・面接だけでなく、何度か飲みながら意見交換し**入社後の具体的なイメージが出来た**ことがよかったと思います。
この経験から、現在は採用の際には可能な限りオフサイトの場でお互いの話をするようにしています。

内定前なので可能な範囲ですが、以下のことを確認しました。

* 会社・事業の現状と今後
* 組織の状態と課題
* 各メンバの特性
* システム概要、技術的な課題
* 利用技術、開発手法、プロセス
* 自分に期待している成果
* 任せたい/任せる範囲(権限的なこと)

解決が求められていた課題に関しては、実際自分ならどうするとか、経験的にこういうやり方をしてました、という具合なディスカッション出来たため、**受け入れ側としても入社後想定外の人だったというリスクは軽減出来た**かなと思います。

# 入社してからやったこと

## 理解する

当然ながら、配下のメンバがどんな人なのかを知ることが第一歩です。

* 担当業務について
* これまで経験、経歴
* これからやっていきたいこと
* 不満や課題、改善したいこと
* 会社にいるモチベーション
* 自分に期待したいこと

と言ったことを聞きながら、組織の現状を把握しつつ、関係部署の方にもお話を伺い、外からの見え方も確認した上で、何から着手するかを検討しました。
**外から来ると、特に課題が目がつきます**。これは、既存の人が習慣化されているもの、他の優先度が高くそのままにしていること、リソースがなく手がつけられないなど事情があります。
理解してもらうには、まず理解していくことなので、**協力して抱えている課題を一緒に解決していく姿勢を見せ、現状を受け入れ次に何をするのか**を大事にし、次のアクションへと繋げることを意識しました。


## 理解してもらう

タイミング的に下半期の開始とともに入社でしたので、通期の戦略、上期の流れを汲むつつ、今後の方針を作りました。そこには施策だけでなく、組織の存在意義、どういう組織にしたいか、そして自分がどういう貢献をしていきたいかも明言しました。

経験値を期待されて入社していますので、**自分の持つ経験、スキルは出し惜しみしない**ことも大事です。勉強会やレビューなどを通じて、経験・スキルを伝えています。

## やったこと

既存の仕組みでうまく行っていること事はいじらずそのままに、すぐに解決できる課題から着手しつつ、大きめの課題のプランニングを並行して行いました。技術的なことは、コーディング含めて自分が出来ることは何でもやりました。自身の組織として安定するまでは、とにかくやれることはすべてやるスタンスでいました。
前述の内容を含めて、やってきたことは以下になります。

* 1on1の実施
* 情報収集
* 下期の方針策定
* 情報共有改善
* 開発レビュー/プロセスの見直し
* 開発環境の抜本的改善
* リファクタリングの推進
* 新技術導入
* 既存システムパフォーマンス改善

上記に加え、採用活動がうまく行ってなかったので、人事と共に採用方法、採用プロセスの見直しも行いました。

* 募集要項の更新
    * 採用ポジションの整理
    * 欲しいエンジニア像の明確化
* 採用媒体の選定
* エージェントへの説明
    * エンジニア向け会社説明資料も作成した
* 採用プロセスの短縮
など

あと、当然と言えば当然ですが、忘れていけないのは、情報システム運用規程やセキュリティルールなど現在回っているルールを理解した上で、業務遂行して行く必要があります。自身が見る組織、システムの理解も重要ですが、会社としての定められている仕組みをまずは確認しましょう。

# 一年経ってどうか

まだ入社時から抱えている大きい課題はあり発展途上ではありますが、開発環境も変わり、新規事業立ち上げもあり、また採用もうまく回り始め新しいメンバの参画もあり、一年前とは全く違う組織になりつつあると思います。
私が考えた方向性と既存メンバの期待値にズレが少なかったため、協力体制が築けたのが大きな要因だったと思います。それだけでなく、経営層の理解とバックアップは非常に助かりました。

とはいえ、幸い致命的なものはありませんでしたが、失敗したこともたくさんあります。

特に、うまく行っていない見直しする必要な施策がありました。入社間もないこともあり、なかなか決断が出来ず、時間をかけ遠回りしてしまいました。管理職ともなれば入社歴は関係なく、費用対効果の観点で冷静な判断をするべきことを改めて認識しました。


# 最後に

状況、条件によって、同じやり方でも結果は変わりますが、開発責任者として中途入社した時の一つのナレッジとして、一人でも参考になった方がいればうれしいです。
MacでEclipseを使ってJavaを書きたいだけなのに

こんばんは。

早速Javaの学習をしようと思って、MacにEclipseなど諸々インストールしたのですが、

...
とーっても大変でした。

何が大変だったかと言うと、
・どういう手順で何をインストールしていけば良いのかWebサイト毎で違う
・沢山あるバージョンの中でどれをインストールしたらいいのか、
(好きなバージョン選べば良いんだよ、と書いて下さる方もいるのですが、
心配性の私は同じでないと落ち着かず、後で変なところでミスしがち...)

初心者の私はこういうところでつまづきます。
そしてWebサイトをはしごしまくってだいぶ時間を掛けてしまいました。


ということで、一から私の方でわかりやすく書いてみよう！...と考えましたが、
分かりやすくまとまめられているWebサイトにも出会い、無事に(?)環境設定を終えましたので、
ブログを書く時短にもなりますし(←)、今回はそちらをご紹介したいと思います。
最後に今回の一連の流れでつまづいてしまった所もご紹介しています。
同じようにうまく出来ない方の参考になればと思います。



## ブログのご紹介

1.『新米Java講師がMacにEclipseをインストールする』の巻
https://saycon.co.jp/hrm/eclipse/
以下のインストールの手順を紹介しています。
・JDK
・Eclipse
・Pleiades(Eclipseの日本語化)


2.EclipseでTomcatを設定する。
http://ponsuke-tarou.hatenablog.com/entry/2018/03/04/140035#Tomcatをインストールします
このWebサイトではEclipseでTomcatを設定する手順を紹介しています。


## 私がつまづいた点
今回私はTomcat8の8.5.37をインストールしたのですが、
Eclipseでサーバーの登録をする際にこんなエラーメッセージが出てしまいました。
![スクリーンショット 2018-12-23 23.02.25.png](https://qiita-image-store.s3.amazonaws.com/0/330502/be9ab5d8-4549-f2e7-1582-bdc5a84484ee.png)



## 改善方法
1.Eclipse画面左上の[Eclipse] >[環境設定]から設定画面を開く
![スクリーンショット 2018-12-23 23.32.42.png](https://qiita-image-store.s3.amazonaws.com/0/330502/e1f7c94e-b1b0-987b-7e7f-ddb0693eb85b.png)



2.[サーバー] > [ランタイム環境]から画面右横にある[追加]ボタンを押下する
![スクリーンショット 2018-12-23 23.03.42.png](https://qiita-image-store.s3.amazonaws.com/0/330502/4500596c-a5d9-c711-a314-b50d2670d5a2.png)


3.「Apache Tomcat v8.5」を選択し、[完了]を押下する
![スクリーンショット 2018-12-23 23.03.18.png](https://qiita-image-store.s3.amazonaws.com/0/330502/78ca5085-0705-8f1c-016f-f1ff3df33dd6.png)




4.[適用して閉じるを押下後、画面右下の「サーバー」から「使用可能なサーバーが...」を押下する
![スクリーンショット 2018-12-23 23.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/330502/8c7faae2-5664-de53-fb43-e20108f24d75.png)


5.新規サーバー画面から[Apache Tomcat v8.5]を選択し、[完了]を押下する
![スクリーンショット 2018-12-23 23.41.23.png](https://qiita-image-store.s3.amazonaws.com/0/330502/183da8f1-ebc2-9e64-9afa-2abfe00f3a97.png)



6.設定完了！
![スクリーンショット 2018-12-23 23.43.19.png](https://qiita-image-store.s3.amazonaws.com/0/330502/997460a2-1df8-5a98-af13-74e95f7da23c.png)






## 最後に
だいぶ時間が掛かってしまいましたが...笑
やっっっっっっっつと準備が終わりました。
は〜〜疲れました。笑
誰かの役に立てたら嬉しいです...！(といってもほとんどブログのご紹介...笑)

では、次からプログラミングの内容に取り掛かりたいと思います。:sparkles:
...といっても、だいぶ初歩的な内容なのですが...
これからも温かい目で見守って下さると嬉しいです。
シクシク素数列 - C言語編

###ルール
数値に4か9を含む素数をシクシク素数と呼ぶことにします
19とか41とか149とか。
標準入力として正の整数 N を与えたら N 番目までのシクシク素数を半角カンマ区切りで標準出力してください
例 N = 9 の場合、 19,29,41,43,47,59,79,89,97
N は最大で 100 とします

#ソースコード

```c:sksk.c
#include <stdio.h>

//数値から4と9を見つける
int find49(int i49_) {
	while (i49_ != 0)
		switch (i49_ % 10) {
		case 4:case 9: return 1;
		default: i49_ /= 10;
		}
	return 0;
}
//素数を探す
void prime(const int n_) {
	for (int i = 1, prime = 0, counter = 0;; ++i, prime = 0) {
		for (int j = 1; j <= i; ++j)
			if (i % j == 0) ++prime;
		if (prime == 2 && find49(i) == 1) {
			printf("%d", i);
			if (++counter != n_) printf(",");
			else break;
		}
	}
	printf("\n");
}
//入力値のシクシク素数を返す
int main() {
	int n;
	scanf_s("%d", &n);
	prime(n);
}
```

とりあえず30行で実装。
高速化はしてないです。

#実行結果

```:出力結果(入力7)
19,29,41,43,47,59,79
```

```:出力結果(入力9)
19,29,41,43,47,59,79,89,97
```

```:出力結果(入力19)
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239
```

```:出力結果(入力22)
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239,241,269,293
```

```:出力結果(入力49)
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239,241,269,293,347,349,359,379,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,509,541,547,569
```

```:出力結果(入力100)
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239,241,269,293,347,349,359,379,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,509,541,547,569,593,599,619,641,643,647,659,691,709,719,739,743,769,797,809,829,839,859,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1019,1039,1049,1069,1091,1093,1097,1109,1129,1193,1229,1249,1259,1279,1289,1291,1297,1319
```

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。