OmniAICreator/Qiita-1.07M huggingface dataset:
CocoaPodsで入れたSDKのduplicate symbolエラーを回避

ReactNativeの開発をしていて、SDKをCocoaPodsからインストールした時にビルドができない
 duplicate symbol エラーに遭遇してえらい苦労したので備忘録。
### 環境
- ReactNative: 0.49.3
- GVRKit (GVRSDK): 1.100.0
 
### duplicate symbol とは？
buildすると、こんなエラーが出ました。

```
duplicate symbol __ZN3fLI9FLAGS_novE in:
/foo/ios/Pods/GVRSDK/Libraries/libGVRSDK.a(vlog_is_on.o)
/foo/ios/build/Build/Products/Debug-iphonesimulator/libReact.a(vlog_is_on.o)
duplicate symbol __ZN3fLI7FLAGS_vE in:
/foo/ios/Pods/GVRSDK/Libraries/libGVRSDK.a(vlog_is_on.o)
/foo/ios/build/Build/Products/Debug-iphonesimulator/libReact.a(vlog_is_on.o)

ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)


** BUILD FAILED **

The following build commands failed:

Ld build/Build/Products/Debug-iphonesimulator/foo.app/foo normal x86_64
(1 failure)
```
どうやら、GVRSDKの libGVRSDK.a とReactNativeの libReact.a のライブラリファイルが同じsymbol（vlog_is_on.o）を重複して読み込んでいるということらしい。

困っている人は他にもいるようです。
https://stackoverflow.com/questions/44838800/react-native-incompatible-with-google-vr-sdk

### Symbolの重複を解消する！
ライブラリはバイナリファイルだけど、 **lipo** コマンドで分解可能。
分解したファイルから重複したシンボルを削除して、**ar** コマンドで再結合。

実際は libGVRSDK.a が四つのアーキテクチャ向けファイルに分解されるので、それぞれから vlog_is_on.o　のシンボルを削除、最後にまた合体しています。

```pod_post_install.sh
#!/bin/bash

cd ./Pods/GVRSDK/Libraries/
lipo -info libGVRSDK.a

# Divide to each platform
lipo -thin armv7 libGVRSDK.a -output libGVRSDK_armv7
lipo -thin i386 libGVRSDK.a -output libGVRSDK_i386
lipo -thin x86_64 libGVRSDK.a -output libGVRSDK_x86_64
lipo -thin arm64 libGVRSDK.a -output libGVRSDK_arm64

# Delete duplicate file
chmod 777 libGVRSDK_armv7
chmod 777 libGVRSDK_i386
chmod 777 libGVRSDK_x86_64
chmod 777 libGVRSDK_arm64

ar -dv libGVRSDK_armv7 vlog_is_on.o
ar -dv libGVRSDK_i386 vlog_is_on.o
ar -dv libGVRSDK_x86_64 vlog_is_on.o
ar -dv libGVRSDK_arm64 vlog_is_on.o

# rm libGVRSDK.a
lipo -create libGVRSDK_armv7 libGVRSDK_i386 libGVRSDK_x86_64 libGVRSDK_arm64 -output libGVRSDK.a

# Delete media
rm libGVRSDK_armv7
rm libGVRSDK_i386
rm libGVRSDK_x86_64
rm libGVRSDK_arm64

cd ../../../
```
これで、buildが通るようになりました。

ですが、Podをリセットしたりすると再発するし、毎回やるのはあまりにも骨。であれば、自動化しましょう。
上記をシェルスクリプトにして、Podfile の post_install で実行するように加えます。これでPodがupdateされるたびにコンフリクトするシンボルを削除します。

```
post_install do |installer|
    system(". ./pod_post_install.sh")
end
```

全てCocoaPodsで管理すればこのような依存問題はないのかもしれませんが、ReactNativeはnpmでインストールされているため問題が起きたのかな、と予想しています。

##参考リンク
http://venture-blog.blogspot.jp/2013/04/duplicate-symbol-objcclassxxx.html
https://github.com/googlevr/gvr-ios-sdk/issues/163
DBの予約語一覧ページリンク集【2017年11月更新】

DBの予約語を調べたのでリンクをまとめました。

- MySQL 5.6
    - https://dev.mysql.com/doc/refman/5.6/en/keywords.html
- MySQL 8
    - https://dev.mysql.com/doc/refman/8.0/en/keywords.html
- PostgreSQL 9.6
    - https://www.postgresql.org/docs/9.6/static/sql-keywords-appendix.html
- PostgreSQL 10
    - https://www.postgresql.org/docs/10/static/sql-keywords-appendix.html
- Oracle
    - http://otndnld.oracle.co.jp/document/products/oem10/1020/generic/B31703-01/app_oracle_reserved_words.htm
- SQL Server
    - https://msdn.microsoft.com/ja-jp/library/ms189822(v=sql.120).aspx
Firefox 57 (Quantum)でフォント設定がうまくいかない

// --- 2019/03/28追記 ----
以前書いたこの記事ですが、Firefox 65から一部のサイトでタブがクラッシュするようになりました。
問題はプロポーショナルフォントが空になっていたからのようです。
設定画面からプロポーショナルのフォントを設定することでクラッシュしなくなりました。
![スクリーンショット 2019-03-28 14.58.59.png](https://qiita-image-store.s3.amazonaws.com/0/16070/badaee0d-f788-89fb-d8d2-3318ca1853ad.png)

about:configの変更は以下のような感じです。("font*ja"で検索)
![スクリーンショット 2019-03-28 15.00.03.png](https://qiita-image-store.s3.amazonaws.com/0/16070/6079fbdb-4038-fb87-bff7-62e65636116c.png)
// --- 2019/03/28追記ここまで ----

<br />
<br />

Macのブラウザでは『ヒラギノ丸ゴ ProN』を好んで使うのですが、Firefox 57 (Quantum)では環境設定から好きなフォントを設定できます。
しかし、自分のMacの環境ではFirefoxのフォント設定を『ヒラギノ丸ゴ ProN』に設定してもうまく反映されず、またFirefoxを再起動すると元のフォント設定に戻ってしまう問題が起きたので、それへの対応。

単純に、about:confit 画面で以下のように手当たり次第日本語フォント設定を『Hiragino Maru Gothic ProN』にしました。
![スクリーンショット 2017-11-09 13.25.21.png](https://qiita-image-store.s3.amazonaws.com/0/16070/82164cd8-b33f-91f4-ffd5-980ff4ff12f0.png)

これでFirefoxの設定画面でも『ヒラギノ丸ゴ ProN』と表示され保持されるようになりました。（プロポーショナルはうまくいっていませんが...）
![スクリーンショット 2017-11-09 13.26.01.png](https://qiita-image-store.s3.amazonaws.com/0/16070/bdeb8cf2-3fd0-87a4-b452-609cc67e05e8.png)

以上。
PDFのページ単位のローテーション設定 | Acrobat XI

とあるPDFビューアでPDFのページにローテーションがかかっている場合に、
そのページ内のリンクの表示がずれてしまうということがありました。
Acrobat XIを使って各ページ毎のローテーションを変更する方法を調べたので書き残しておきます。

**※縦横向きが混在した紙の資料をスキャンして1つのPDFにしたときにも、各ページごとにローテーション指定して保存しておくと、単純にPDF閲覧がしやすくなると思います。**

----
手順は下記のとおりです。  
1. 該当ページにローテーションがかかっているか確認
2. PDFのページの回転を設定し保存
3. 該当ページにローテーションがかかっていないことを確認
## 1. PDFの該当ページにローテーションがかかっているか確認
1-1. [編集]->[プリフライト]メニューを実行
<img width="395" alt="スクリーンショット 2017-11-08 16.50.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/188535/3f0dcc29-261f-596e-525d-acfac65245c0.png">

1-2. プリフライトウィンドウの [オプション]->[PDFの内部構造を参照...]メニューを実行
<img width="761" alt="スクリーンショット 2017-11-08 16.56.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/188535/f82179e5-e1cb-76f5-52f4-0ba5a8bef292.png">

1-3. PDFの内部構造ウィンドウで該当ページの"Rotate"属性を確認。
<img width="465" alt="スクリーンショット 2017-11-09 2.04.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/188535/3cb164b7-5850-d6f8-dbd3-d15810e622f6.png">

## 2. PDFのページの回転を設定
2-1. ページサムネールを表示し、対象とするページを右クリックし、[ページを回転...]メニューを実行
<img width="471" alt="スクリーンショット 2017-11-08 16.49.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/188535/de6f9ab0-7746-ba2d-6a40-78021612a030.png">

2-2.  "方向"と"ページ範囲"を選択してOKボタンを押下(今回は方向:180°、ページ範囲:選択したページにしています)
<img width="635" alt="スクリーンショット 2017-11-09 2.07.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/188535/abe1a3ec-de09-4136-3333-047db0e27e09.png">

## 3. 該当ページにローテーションがかかっていないことを確認
3-1. 前述の[1-1]〜[1.3]の手順でPDFの内部構造を確認し、"Rotate"属性がなくなっていることを確認
<img width="464" alt="スクリーンショット 2017-11-09 2.22.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/188535/ee76defd-b177-4802-3e51-f7db90a2fc19.png">
3-2. PDFを開き直しても変更したページごとのローテーション通りに表示されることも確認できます。
Git初心者が覚えておくと役立つコマンド

Gitの初心者の方が覚えておくと便利かなと思うコマンド一覧です。


### 直前のcommitに追加で変更を加えたい
一つ前のcommitに現在の変更を加える

```
$ git commit --amend
```


### commitしたけど名前が気に入らない
一つ前のcommitの名前を変更する 

```
$ git commit --amend -m "commit name"
```

### １つ以上前のcommitをまとめたい
複数のcommitをまとめる

```
$ git rebase -i HEAD ~ [commit id]
```

### commit間のdiffをみたい
commit間の変更を見る

```
$ git diff [commit id] [commit id]
```

### remoteとのdiffをみたい
remoteのbranchとの差を見る

```
$ git diff HEAD [remote branch]
```

### 作業途中だけどremoteからpullしたい
```
# stashで変更を退避
$ git stash

# 変更がすべて退避されたので、pull
$ git pull [remote branch]

# 退避した変更を適応
$ git stash apply [stash id]
```

### remoteからbranchをcheckoutしたい
```
$ git checkout -b [branch name] [remote branch]
```

### 変更をすべて消し去りたい
一つ前のcommitの状態にもどす

```
$ git reset --hard HEAD
```

### ある時点のcommitまで戻したい
指定した時点までcommitを戻す

```
$ git reset [commit id]
```
### commitを消してしまった時
```
# commitログを確認
$ git reflog

# commitを戻す
$ git reset --hard [commit id]
```
Google Developer Documentation Style Guide自分用まとめ

https://developers.google.com/style/
から自分にとって有用そうな部分だけを抜粋しておく。

## 手順は1. 2. a. b. i. ii.

```
1. First, do foo, as follows:
    a. Do the first part of foo.
    b. Do the second part of foo. There is no third part.
        i. Do the first sub-part of foo part two.
        ii. Do the second sub-part of foo part two.
2. Next, do bar.
```

https://developers.google.com/style/procedures

## メニューなどの操作順番を表すには「>」（不等号）を使う

**File** > **New** > **Document**

https://developers.google.com/style/procedures


## コマンドと出力の書き方

次のコードをターミナルに入力します:

```
$ adb devices
```

以下が出力されます:

```
List of devices attached
emulator-5554  device
emulator-5556  device
```

- プロンプトを表す「$」をつける
- 他のマシンにsshしたときなどはプロンプトを変えても良い
- 入力と出力は囲みを分ける

実際の値で置き換えるべきプレースホルダは\<var>タグで囲む。すると見た目はイタリックで文字色がピンクになる。

OK: cp *from* *to*
NG: cp \<from> \<to>
NG: cp {from} {to}

https://developers.google.com/style/code-syntax

## ユーザーが入力する文字列は\<kbd>タグで囲む

https://developers.google.com/style/code-in-text


## \<code>タグの使い方

以下のものは\<code>タグで囲む

- 言語のキーワード
- クラス名
- メソッド名、関数名
- XMLやHTMLの要素名
- 属性名と値
- ファイル名やパス
- 属性や値の取りうる定数値
- 名前空間のエイリアス
- HTTPの動詞
- HTTPステータスコード
- HTTPのcontent-typeの値
- クエリーパラメータ名とその値
- コマンドラインユーティリティ名

以下のものは普通のフォントで表記する

- URL
- メールアドレス
- 見出し

https://developers.google.com/style/code-in-text

## メソッド名の書き方

OK: メタデータを取得するには`get()`メソッドを呼びます。

クラス名や引数名を含めても良い:

OK: `TextView.setText()`
OK: `setText(CharSequence, TextView.BufferType)`


## 注意書きはNote, Caution, Warning, Success

ちなみにMicrosoftはNote, Tip, Important, Cautionを使っている。

https://developers.google.com/style/notices

## 見出しの最初の文字は大文字にする

https://developers.google.com/style/capitalization

## 数字と単位の間にはスペースを入れる

NG: 64GB
OK: 64 GB

https://developers.google.com/style/units-of-measure
5つの購買行動モデル まとめ

# 購買行動モデル
　マーケティングは、消費者の行動に大きく影響されるため、日々変化しているもの。特に、消費者が商品を購入するまでの流れは、インターネットの発展により劇的に変化・多様化している。
現在最新と言われているDual AISAS, DECAXモデルについて記述している投稿がなかったため、投稿致します。

※時間のない方は、Dual AISAS, DECAXのみで十分かと思います。

## AIDMA
1920年代のアメリカで提唱されたもの。購買モデルの雛形として考えると良い

 - A(Attenstion)：　認知・注意
 - I(interest)：　興味・関心
 - D(Desire)：　欲求
 - M(Memory)：　記憶
 - A(Action)：　行動
  
商品の広告を見て知る。
興味関心の対象であれば、欲しくなり、記憶に残る。
購入する。
(※アメリカだとAIDAの方が一般的)

## AISAS
1990年代に電通によって提唱。インターネット時代に適用していると言われている。

- A(Attenstion)：　認知・注意
- I(interest)：　興味・関心
- S(Search)：　検索
- A(Action)：　行動
- S(Share)：　共有

Search, Shareがインターネットに適用した要素。
興味関心を持てば、ググる。
買った後、SNSで共有することもある。この共有が他人の認知になることも。

## SIPS
2011年に電通によって提唱。SNSを頻繁に使用する層の購買意欲を説明したもの。AIDMAとの併用が普通。

- S(Sympathize)：　共感
- I(Identify)：　確認
- P(Participate)：　参加
- S(Share & Spread)：　共有・拡散
 
完全にSNS上での行動を示したもの。

## Dual AISAS
2015年ごろ？に電通の有園　雄一さんが提唱。
横軸(ISAS)と縦軸(AISAS)で考え、横にも縦にも循環しているというモデル。

- I(Interest)：　興味・関心・共感・利益
- S(Share)：　共有
- A(Accept)：　受容・共鳴
- S(Spread)：　拡散

（＋AISAS）

AISASのAttentionを、SNSが補っているのと、要素一つ一つの役割も多様化しているのが特徴。
（下記参考サイト要参照）
Acceptが素敵。

## DECAX
2015年に電通の内藤敦之さんが提唱。

- D(Discovery)：　発見
- E(Engage)：　関係
- C(Check)：　確認
- A(Action)：　行動
- eX(eXperience)：　体験・経験
 
Discovery, Engageが特徴的。あとは、以前のやつと似てる。
消費者自身がコンテンツを発見して、とりあえず無料登録して、相性を試すなど

Engage：　時間をかけて関係構築するという考えが自分に刺さりました。

## 所感
消費者が情報に対して、能動的になっているのが面白い。
電通がすごい。
Qiita内においても、自分の投稿を購入（いいね、ストック）してもらうと考えると興味深い。

## これを受けて
Dual AISAS, Decaxを元に考えると、
消費者による能動的な情報の取得と共有・拡散がキーになる。

消費者が能動的に行動するとはいえ、

- 消費者が情報を取得しやすいように発信する必要があると思います。（SEO。[構造化データ](https://qiita.com/kudo_kk/items/b13b316316abcc4d6dfd)も含めて）
- もしくは、共有・拡散したくなるような仕掛けが必要。(デザイン。イベント)
- Engage構築がこれからのWebサイトの課題

## 参考
- [導線設計について考える](https://qiita.com/mikakane/items/814f05ff460285b99049)
- [AIDMA・AISAS・SIPS｜マーケティングにおける購買行動モデルをおさらい リクナビ](https://next.rikunabi.com/journal/entry/20161101_S8)
- [いまどきの消費者行動の実態は、AISAS から DUAL AISAS へモデルチェンジしている Unyoo.jp](http://unyoo.jp/2015/03/dual-aisas/)
- [Dual AISASで考える、もっと売るための戦略。  電通報](https://dentsu-ho.com/articles/3100)
- [DECAX・Dual AISASの法則 コンテンツ発見型の消費者行動モデル](https://swingroot.com/decax-dualaisas)
- [「購買行動モデル」の時代変化と今 innova](https://innova-jp.com/3735/)
設置が一番簡単な google-code-prettify でソースコードを読みやすく

#はじめに

google-code-prettify は HTML ページに含まれるソースコードのキーワードなどに色を付けて見やすくするためのライブラリです。
他にも同様の JS ライブラリがありますが、google-code-prettify は設置が簡単なのが特徴です。(その一方、多機能ではありません)

ソースコードやドキュメントは次のリポジトリからダウンロードできます。詳しい使い方は [gettting_started.md](https://github.com/google/code-prettify/blob/master/docs/getting_started.md) を参照してください。

[google / code-prettify](https://github.com/google/code-prettify)

(注意) 以前の Google のサイトから変更になりました。

##関連ページ
[JS ハイライト表示ライブラリ3種](https://qiita.com/tadnakam/items/1323d03743fc0101aa50)

#要点

この手のライブラリ(ソースのカラー表示)の使い方としては一番簡単です。

- script タグを使って https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js をロードする。
- カラー表示するソース部分を pre タグで囲み class="prettyprint" を指定する。
- ソース内の < や & をエスケープする。

#Google Code Prettify のロード

スクリプトとスタイルシートのロードは、次のようにすることで一括して行えます。

```HTML
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
```

#ソースコード部分の指定

修飾するソースコード部分の指定は下のように行います。

```HTML
<pre class="prettyprint">
source code here
</pre>
```

#サンプル

JavaScript (Node.js) のソース表示例です。

![google-code-prettify.png](https://qiita-image-store.s3.amazonaws.com/0/62802/20eed356-52c3-ae6b-dd5a-9e1e95e0d6db.png)


HTML ソース全体は下のようになります。

```HTML
<doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Google Code Prettify</title>
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
</head>

<body style="margin-left:5%; margin-right:5%;">
<h1>Google Code Prettify</h1>
<hr />

<p>JavaScript (Node.js) のソース表示例です。</p>
<pre class="prettyprint">
	var express = require('express');
	var router = express.Router();

	/* GET home page. */
	router.get('/', function(req, res, next) {
	  res.render('index', { title: 'Express' });
	});

	/* GET /about */
	router.get('/about', function(req, res, next) {
	  res.render('about', { title: 'バージョン情報', version: "0.1" });
	});

	/* GET /value/:n */
	router.get('/value/:n', function(req, res, next) {
	  res.render('value', { title: "パラメータ付きのルート", n: req.params.n});
	});

	module.exports = router;
</pre>
</body>
</html>
```

#その他

やったことないですが、次のようなこともできるようです。詳しくは、 [docs/getting-started](https://github.com/google/code-prettify/blob/master/docs/getting_started.md) 参照。

- 言語の指定(ハンドリング)
- スキンの指定
- プリティプリントが終了したことのJavaScript通知
- 独自 JS と CSS の使用
- スタイリングの指定
- 言語のヒント
- 行番号の付加



終わり
VSCode + Babel でデバッグをする

Visual Studio Code を利用して node.js のプロジェクトのデバッグを行うとブレークポイントの利用ができるなど非常に便利です。しかし、babelを利用してコードのトランスパイルを行っていると、デフォルトの設定ではブレークポイントを貼り付けることができません。ここではその対応を行い、bableを利用してもブレークポイントを利用してデバッグができるようにします。

## ビルドをするscriptを定義する

babelでコードをトランスパイラするためのscriptを`package.json`に定義します。

```json:package.json
"scripts": {
  "build": "babel src/ -d build/ --source-maps",
}
```

パスなどは自分の環境に合わせて変更をしてください。`--source-maps`というオプションを付けてトランスパイル元のファイルと前のファイルを結びつけます。

## タスクを定義する

次に、Visual Studio Code で利用するタスクを定義します。`.vscode/tasks.json`を編集します。

```json:.vscode/tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "identifier": "build",
      "type": "npm",
      "script": "build",
      "problemMatcher": []
    }
  ]
}
```

Visual Studio Code から`npm run build`を呼び出すことができるように成りました。

## 実行の構成を作る

最後にVisual Studio Code の実行のための構成を作ります。`.vscode/launch.json`を編集します。

```json:.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [

    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceFolder}/build/index.js",
      "preLaunchTask": "build",
      "sourceMaps": true,
      "outFiles": ["${workspaceRoot}/build"]
    }
  ]
}
```

`preLaunchTask`で先程定義をした`build`タスクを呼び出してbabelによるトランスパイルを行います。`sourceMaps`オプションを`true`とし`outFiles`にトランスパイルされたファイルが格納されているディレクトリのリストを指定します。

Visual Studio Codeの`デバッグ->デバッグの開始`でコードの実行ができます。また、トランスパイル前のコードにブレークポイントを設定しても、コードを停止することが可能です。

## まとめ

Visual Studio Codeのデバッグ機能を利用してbableによってトランスパイルされたコードに対してもブレークポイントを利用するための設定を紹介しました。
AIX 非IPネットワーク疎通確認

# AIX 非IPネットワーク疎通確認

##  RS232C疎通確認

1. 稼働系
```
stty </dev/tty
```

2. 待機系
```
stty </dev/tty
```

3. tty設定が両ノードで出力


## ディスクハートビート

1. 稼働系
```
/usr/sbin/rsct/bin/dhb_read -p hdiskX -r
```

2. 待機系
```
/usr/sbin/rsct/bin/dhb_read -p hdiskX -t
```


3. 両ノードに"Link operating normaly"と表示
新卒エンジニアとして習慣化したいアウトプット3つ



#Qiitaに投稿する
読むばかりになっていませんか？
もちろん読むのも勉強になりますが、一番勉強になるのは書くことです。
自分がその日学んだテクニカルなことを発信しましょう。
読者の方の役に立つだけでなく、自分のメモ代わりにもなるのでとてもおすすめ。

そしてエンジニアは、自分の考えを人に分かりやすく伝えるコミュニケーション能力がとても大切。
同じエンジニアだけでなくデザイナーやディレクターなどと関わることも多いからです。
文章を書くことで、人に分かりやすく話を伝える能力が鍛えられます。
そういう意味でも、Qiitaに投稿することはみんなにやってほしいです。

ちなみにStackoverflowやTeratailに投稿するのもありですね。
#OSSに貢献する
オープンソースに貢献しましょう。定番はみんな大好きGithub。

でも、オープンソースに投稿するのってなんかこうハードルが高い。。
自分みたいなペーペーのエンジニアなんかの書く内容が役に立つわけなんてない。
と思っちゃいますよね。

実際に僕も思ってました。
でも、この記事を読んでオープンソースへのアウトプットもやってみようかなと気持ちが変わったんですね。
→[意外ととっつきやすいOSS開発参加方法まとめ]
(https://qiita.com/shunsuke227ono/items/94dd6e707d34a1da2617)

僕もまだOSSに書き込んだことがないので、上の記事を参考にしてみてください。

#オリジナルアプリを開発する
アプリエンジニアにとっての一番のやりがいですね。
毎日ひたすらコードを書くよりも、1個アプリを自分で作るほうが学びになるでしょう。
自分が作りたいアプリを開発するのは、プログラミング学習のモチベーションにもなりますしね。

会社で学んだことを活かしたり、技術書で読んだ内容を実践したりする場には最適だと思います。
そして、マネタイズやデザインなども考えてサービス開発できると、ビジネスサイドの分かるエンジニアとして活躍できるかもしれません。
#インプットではなくアウトプットファーストで
プログラミング学習は、どうしてもインプット偏重になりやすいと思います。
なんでかというと技術書を読むだけで、勉強した気になるしやった感があるんですよね。
満足感はすごいけど、必ずしもスキルが上がってるわけではないです。

なので、アウトプットファーストでプログラミング学習をしていきましょう。
そして、そのアウトプットに対して人からのフィードバックがあるとなおさらいいと思います。

こうしてQiitaに書くことで、いいね数やコメントなどのフィードバックが来るので、僕が一番の勉強になっています。
なので、この記事で気になったところがあればどしどしコメントくださいね。

本当に上の3つのアウトプット方法はおすすめです。
とりあえず僕はこれらの習慣化を直近の目標にして、日々プログラミング学習に励んでいこうと思います。
【memo】KotlinのDevをandroid studioで使う

Dev環境使いたくて悩んだのでメモ

##環境
Android Studio3.0
Tools -> Kotlin -> Configure Lotlin Plugin Updatesで
Update channelを `Early Access Preview`に変更（関係あるかは知らないけど）

##修正ファイル
buildscriptとallprojectsのrepositoriesに
`maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.2" }`を追加
dependenciesのclasspathを使いたいバージョンにする（今回は `1.2.0-rc-39`）

```build.gradle
buildscript {
    repositories {
        maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.2" }
    }

    dependencies {
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.0-rc-39'
    }

allprojects {
    repositories {
        maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.2" }
    }
```
app/build.gradleも使いたいバージョンにする（今回は `1.2.0-rc-39`）

```app/build.gradle
dependencies {
        classpath 'org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.0-rc-39'
    }
```

###最新版は下記（kotlin-stdlib-jre7）
https://www.mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib-jre7
Golangを学ぶ

## はじめに

Golangを始めるときは、野良のブログとかよりも、公式のドキュメントが充実しているので、まずそれを読んでから、Githubあたりのプロジェクトを見てみるのが良いと思います。

## まず読むべきもの

- [language spec](https://golang.org/ref/spec)
- [Tour of Go](https://tour.golang.org/welcome/1)
- [How to Write Go Code](https://golang.org/doc/code.html)

[How to Write Go Code](https://golang.org/doc/code.html)は短いので読みやすい。
これらをざっくりと流し読みしたら、次は

- [Effective Go](https://golang.org/doc/effective_go.html)

こちらを読む。

## 何か作る

イメージしやすいのはWebアプリなので、とりあえずなんか作ってみる。

サンプルのGoWikiでも良い。

- [Writing Web Applications](https://golang.org/doc/articles/wiki/)

## GoのJSONパース

これは意外と良い。というかタイプセーフかつ、タイピングを最小限でやるにはかなり有効な感じ。
サーバーサイドの設計がしっかりしていれば、ほとんどクライアントサイドで困ることはないだろう。
PowerShellでマージ済のgitブランチを一括削除

以下の記事にあるコマンドをWindows上で実行したくなったので、PowerShellに書き換えました。
[Gitでマージ済みブランチを一括削除](http://qiita.com/hajimeni/items/73d2155fc59e152630c4)

# 前提
PowerShell Core 7 がインストール済であること

# コマンド

記事と同様に現在のブランチとdevelop,masterは除外しています。

```powershell
git branch --merged `
  | Select-String -NotMatch -Pattern "(\*|develop|master)" `
  | %{ git branch -d $_.ToString().Trim() }
```

# モジュール化

PowerShell Core を起ち上げ、`$env:PSModulePath`と入力します。
出力されたパスがモジュールの格納場所になります。今回は`$HOME\Documents\PowerShell\Modules`に以下のpsm1ファイルを保存します。

```powershell:GitExtension.psm1
function Remove-GitBranchMerged {

    # 引数で指定されていなければカレントディレクトリを対象にする
    $dir = $args[0]
    if ($args.count -eq 0) {
        $dir = (Get-Location)
    }

    Write-Host ("target directory:" + $dir)

    Push-Location $dir

    git fetch --prune origin
    git branch --merged `
        | Select-String -NotMatch -Pattern "(\*|develop|master)" `
        | ForEach-Object{ git branch -d $_.ToString().Trim() }

    Pop-Location
}
```

PowerShell Core を起ち上げなおすと`Remove-GitBranchMerged`が使えるようになるはずです。
とりあえずESlintを導入したい

Reactとか、NodeのアプリケーションにESlintをとりあえず導入したい。
細かい設定はめんどくさいからAirbnbとか有名どころのスタイルに合わせたい。

# インストール
ローカルにインストールするのがオススメです。

```shell-session
$ npm install --save-dev eslint
```
# 対話形式で設定
ローカルにインストールされたeslintを実行するために`npx`コマンドを使います。

```shell-session
$ npx eslint --init
```

で4つの質問に答えるだけ！
ちなみに僕はこんな感じです。
<img width="493" alt="スクリーンショット 2017-11-09 12.03.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/108339/cc4ac71f-1e20-df87-fc73-db332a27ba95.png">

# 完了!
atomやらvscodeのエディタにeslintのプラグインが入っていたらきっちり怒ってくれます。
<img width="253" alt="スクリーンショット 2017-11-09 12.01.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/108339/79b41176-3c91-25a9-04d9-148846b20663.png">
`const`か`let`使ってねと言われました。
AngularでSwiperを利用したコンポーネントを作成する

Angularにスライダーを作成するため、Swiper(http://idangero.us/swiper/) を導入しようと思います。
ライブラリを使用しても良いのですが、スターの多いライブラリもなく、そもそもあまり複雑なライブラリでもないので、自作のコンポーネントを作成することとします。

# 1.インストール
ライブラリをインストールするだけでOK。
`npm install --save swiper`

# 2.コンポーネントの作成
まずは、swiperのラッパーとなるコンポーネントを作ります。
Swiperのオプションは、デフォルトでも呼び出し元でも設定できるようにしています。

```ts:swiper.component.ts
import { Injectable, Inject, Component, ElementRef, Host, Input } from '@angular/core';
import Swiper from 'swiper';

@Injectable()
@Component({
  selector: 'swiper-container',
  template:`
    <div class="swiper-container">
      <div class="swiper-wrapper">
        <ng-content></ng-content>
      </div>
      <div class="swiper-pagination"></div>
    </div>`
})
export class SwiperContainer {
  @Input() public options: any;
  public swiper: any;

  constructor(@Inject(ElementRef) private elementRef: ElementRef) {
  }

  public ngOnInit() {
    let options = this.setDefaultOptions({
    }, this.options);

    const nativeElement = this.elementRef.nativeElement;
    this.swiper = new Swiper(nativeElement.children[0], this.options);
  }

  public update() {
    setTimeout(() => {
      this.swiper.update()
    });
  }

  private setDefaultOptions(dest: any, ...args: any[]) {
    for (let i = arguments.length - 1; i >= 1; i--) {
      let source = arguments[i] || {};
      for (let key in source) {
        if (source.hasOwnProperty(key) && !dest.hasOwnProperty(key)) {
          dest[key] = source[key];
        }
      }
    }
    return dest;
  }
}
```

次に、スライド部分のコンポーネントです。

```ts:swiper.component.ts
@Injectable()
@Component({
  selector: 'swiper-slide',
  template: '<div><ng-content></ng-content></div>'
})
export class SwiperSlide {
  private ele: HTMLElement;

  constructor(
    @Inject(ElementRef) elementRef: ElementRef,
    @Host() @Inject(SwiperContainer) swiper: SwiperContainer
  ) {
    this.ele = elementRef.nativeElement;
    this.ele.classList.add('swiper-slide');

    swiper.update();
  }
}
```

# 3.コンポーネントを呼び出す
作成したコンポーネントをNgModuleに追加し、以下のように呼び出せばSwiperを使用したスライダーの完成です。

```ts:home.component.ts
import { Component, ViewChild } from '@angular/core';

// shared
import { SwiperContainer } from '../shared/components/swiper/swiper.component';

@Component({
  template: `
    <swiper-container [options]="swipeOptions" #homeSlide>
    <swiper-slide>
      slide1
    </swiper-slide>
    <swiper-slide>
      slide2
    </swiper-slide>
  </swiper-container>
  `

})
export class HomeComponent {
  @ViewChild('homeSlide') public homeSlide: SwiperContainer;
  public swipeOptions = {
    pagination: {
      el: '.swiper-pagination',
      type: 'bullets'
    },
  };

  constructor() {
  }

  goToNextPage() {
    this.homeSlide.swiper.slideNext();
  }
}
```

***

<参考>
参考にしたブログが見当たらなくなってしまったので、見つけ次第記載します。。
シミュレータでテキストフィールドをタップしてもキーボードが表示されない


#環境
Xcode9.1

#解決
シミュレータのメニュー`Hardware`->`keyboard`
で`Connect Hardware keyboard`にチェックを入れた後に
`Toggle Software keyboard`をクリック

`Connect Hardware keyboard`にチェックが入ってる状態でも
`Toggle Software keyboard`をクリックすると表示されるようになるみたいです
MySQLで発番テーブルを使わない連番IDの予約方法

MySQLのAUTO_INCREMENTは、INSERT時に連番を自動発番してくれる大変便利な機能ですが、INSERTする前[^2]に次の番号を知り、予約、独占[^1]しておきたいということがたまにあります。

[^1]: 「どうしても連番じゃなきゃいや」でなければUUIDなどの予約不要なIDの仕組みも検討する価値があります
[^2]: INSERTする前に連番値をテーブルのメタ情報から調べる方法も考えられますが、並行性と整合性を考えたときに果たして安全なのでしょうか？

そういう場合は、発番テーブルなり、発番サーバなり、発番の機構を別に作るわけです。ただ、そこまで頑張りたくないシーンではそういう機構を自作するのはいろいろ面倒に感じます。

そこで、別の選択肢として発番機構を自作せずに連番IDを予約する方法を紹介します。

この仕組みを実現する仕掛けとしては

* トランザクション
* InnoDB
* INSERT文
* AUTO_INCREMENTのidカラム

とありふれたものです。


```mysql
DROP TABLE IF EXISTS posts;

CREATE TABLE posts (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  title varchar(255) NOT NULL, -- titleは必須ということになっている
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
```

```mysql
-- トランザクションを開始する
BEGIN;

-- AUTO_INCREMENTを回したいので適当なデータをINSERTする。
-- IGNOREによりtitleのNOT NULL制約を無視。エラーにならず止まらない。
INSERT IGNORE INTO posts () VALUE (); 

-- 上INSERTで発番されたIDを取得する
SELECT LAST_INSERT_ID() INTO @next_id;

-- INSERTを無かったことにする
ROLLBACK; 

-- 採番されたIDを確認
SELECT @next_id;
```

ロールバックしたら自動採番値ももとに戻ってしまうのではと思うかもしれませんが、MySQLのInnoDBはトランザクションでロールバックしても、一度増やした自動採番値は戻りません。欠番になります。

この連番ID予約方法は、InnoDBとトランザクションの性質を逆手に取った方法なわけです。連番発行機構を作るのに比べるとかなりハック感がありますが、場合によってはありなんじゃないでしょうか。

注意点としては、トランザクション分離レベルがREPEATABLE READ以上でないとファントムリードの危険性はありそうです。
MiniMagickで画像から支配色を抽出


RMagickでメモリ消費しまくるので、MiniMagickに切り替えてみた（結果的には、あまり変わらなかったけど）。

この時に、画像中で使用頻度の高い支配色を抽出するロジックも書き直したのでメモ。戻すカラースタイルは今回HSL形式。

```ruby
path = '/path/to/image'
img = MiniMagick::Image.open(path)
quantity = 5
threshold = 0.01

result = img.run_command(
  'convert', path,
  '-format', '%c',
  '-colors', quantity,
  '-depth', 8,
  '-colorspace', 'HSL',
  'histogram:info:'
)

frequencies = result.scan(/([0-9]+)\:/).flatten.map(&:to_f)
hsl_values = result.scan(/ hsl\((\d+)%,(\d+)%,(\d+)%\)/).map do |hsl|
  { h: 360 * hsl[0].to_i / 100, s: hsl[1].to_i, l: hsl[2].to_i }
end
total_frequencies = frequencies.reduce(:+).to_f

frequencies
  .map.with_index { |frequency, index| [frequency / total_frequencies, hsl_values[index]] }
  .sort           { |r| r[0] }
  .select         { |r| r[0] > threshold }
  .map            { |r| r[1] }
  .slice(0, quantity)
```
さくらクラウドでdocker-machineを立ち上げる手順【windowds編】

# 参照
- SAKURA CLOUD driver for docker-machine
    - https://github.com/yamamoto-febc/docker-machine-sakuracloud

# 手順
※docker-machine名`okazy-dev`は適宜変更してください。

## driverのインストール
~~[こちら](https://github.com/yamamoto-febc/docker-machine-sakuracloud/releases/download/v0.0.13/DockerMachineSakuracloudSetup.exe)からインストーラーをダウンロードして実行してください。~~
現在はdocker-machine-sakuracloudのWindows版インストーラーについては最新版の配布は行われておりません。
GitHubの[Releases](https://github.com/yamamoto-febc/docker-machine-sakuracloud/releases/tag/v0.0.16)ページから最新版のexeをダウンロードし、PATHの通ったフォルダ内に配置してください。

## さくらのクラウドのコントロールパネルからAPIキーを発行
- `設定 -> APIキー`
- `ACCESS TOKEN`と`ACCESS TOKEN SECRET`をメモ

## docker machineの作成

```bash
docker-machine create -d sakuracloud
        --sakuracloud-access-token=${SAKURACLOUD_ACCESS_TOKEN} \
        --sakuracloud-access-token-secret=${SAKURACLOUD_ACCESS_TOKEN_SECRET} \
        --sakuracloud-core=2 \
        --sakuracloud-disk-size=102400 \
        --sakuracloud-memory-size=4 \
        okazy-dev
```

## ~~おそらくエラーが出るので対処~~(最新版では対応済みのためこの手順は不要)

### docker-machineにssh

```bash
docker-machine ssh okazy-dev
```

### 対処

```bash
sudo vi /etc/systemd/system/docker.service.d/10-machine.conf
```

`ExecStart=/usr/bin/docker daemon`を`ExecStart=/usr/bin/dockerd`へ変更

```
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=sakuracloud
```

↓

```
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=sakuracloud
```

```bash
sudo systemctl daemon-reload
sudo systemctl restart docker.service
exit
```

## ローカルの設定変更

```bash
docker-machine ls
docker-machine env okazy-dev
eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env okazy-dev)
docker ps -a
```

## dockerを立ち上げてみる

```bash
docker run -d --rm -p 8080:80 --name web httpd
docker ps -a
```

http://{docker-machineのIP}:8080/

# よく使うコマンドメモ

## docker-machine

```bash
docker-machine ls
docker-machine start okazy-dev
docker-machine stop okazy-dev
docker-machine rm okazy-dev
```

## docker

```bash
docker ps -a
docker run -d --rm -p 8080:80 --name web httpd
docker run -d --rm -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=mysql mysql
docker run -d --rm -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=mysql mysql/mysql-server:8.0
docker run -d --rm -p 5432:5432 --name psql96 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password postgres:9.6
docker stop {CONTAINER ID}
```
【Unity】compute shaderをMacのGame Viewで使う場合


Macで、Unityを使う場合、Game ViewのグラフィックスAPIは、デフォルトで、openGL4.1を、選択されるようです。
macで、compute shaderを、Game Viewで、使うには、以下の、「-force-metal」オプションを使い、Game ViewのグラフィックスAPIを、Metalを使うように設定し、Editorを起動させます。

```C#
[unityを格納しているところまでのパス]/Unity.app/Contents/MacOS/Unity -force-metal
```

で、Editorを、起動。

設定されると、以下のEditorの箇所に、Metalと表示されれば、設定完了です。
![スクリーンショット 2017-11-09 11.11.35.png](https://qiita-image-store.s3.amazonaws.com/0/183884/22834ca5-59e0-a112-fd72-10f8a0249cb3.png)

##追記
2017のEditorだと、「File > Build Settings > Setting for PC, Mac, Linux Standalone > Other Settings」の項目で、Metal Editor Supportというチェック項目が追加されていました、ここをチェックすると、Metalに切り替わりました。

![スクリーンショット 2018-02-08 23.46.16.png](https://qiita-image-store.s3.amazonaws.com/0/183884/3dbe9015-31bd-6c95-ee8d-b481e8cc8957.png)
net/smtpでメールアドレスが存在するか否か判定してみた

参考にさせていただいた記事 
「Ruby で メールアドレスの有効性チェックしてみた」
https://qiita.com/yutackall/items/ce9285ecdf2f03db0404

前回書いた https://qiita.com/motty93/items/43de4df4e3c5f6bb43fc
と、上の記事のハイブリッドです。

## 実行環境
* OSX 10.11.6
* Rails 5.0.4
* Ruby 2.3.1

## コード

```app/controllers/concerns/mail_check.rb
require 'resolv'
require 'net/smtp'

module MailCheck
  extend ActiveSupport::Concern
  MY_DOMAIN = 'gmail.com'.freeze
  PORT = 25

  def mail_check(addr)
    domain = addr.split('@').last
    return { email: addr, domain: false, message: 'domain does not found.' } unless get_exchange(domain)

    addrs_exist?(get_exchange(domain), addr)
  rescue # 送信先メールアドレスが存在しない場合、例外処理へ
    { email: addr, domain: false, result: "#{addr} does not exist." }
  end

  private

  def get_exchange(domain)
    mx = Resolv::DNS.new.getresource(domain, Resolv::DNS::Resource::IN::MX)
    mx.exchange.to_s
  rescue
    nil
  end

  def addrs_exist?(domain, addr)
    Net::SMTP.start(domain, PORT, MY_DOMAIN) do |smtp|
      smtp.mailfrom("送信元メールアドレス")
      res = smtp.rcptto(addr).string.chomp
      { email: addr, domain: true, result: res }
    end
  end
end
```

telnetよりはよさそう。ただ問題が何点かあるっぽいけども。。。
使い方は前の記事を参考にしてみてください、わからんことなどあれば気軽に質問欄に。

## おわり
gem化されればいいのに！
固定トップメニューでアンカー位置を揃える


`position: fixed` で固定ヘッダを置くデザインは未だによく使われるけれど、これをやるとハッシュアンカーでページのスクロールトップが固定ヘッダの裏側に行ってしまい、位置がズレる。

これをあまり難しくならずに解決するのに、 `a` タグへスタイルを当てると楽だった。

```css
/* 固定ヘッダの高さが3remの場合 */
a[name] {
  display: block;
  padding-top: 3rem;
  margin-top: -3rem;
}
```

`bulma` などCSSフレームワークで `a` にカーソル設定してあることがあり、そうなるとこの高さの出来たアンカーでもカーソルが `pointer` になってしまったりするので、一応打ち消しておくと安心。

```css
a[name] {
  cursor: auto;
}
```

ブラウザ次第で上手く動かなくなる可能性もあるかもだけど、今のところそういう話は聞いてません。
CentOSでjavaのバージョン変更

centOSで、javaのバージョンを変更したい際の手順。
毎回調べてしまうので、自分用メモです。

書いてあることは以下の記事とほぼ同じです。
参考にさせていただきました。ありがとうございます。
https://qiita.com/Sa2/items/8ba501294df745be8c78
https://qiita.com/hajimeni/items/67d9e9b0d169bf68d1c9


今回実施した環境
　･　CentOS release 6.9 (Final)
今回落としたいjava
　･　java1.8.x


インストールされているjavaのバージョンを確認。
```java -version```


インストールされているjavaを削除。
```yum remove java-1.6.0-openjdk```
```yum remove java-1.7.0-openjdk```

削除すると、
```
java -version
bash: /usr/bin/java: そのようなファイルやディレクトリはありません
```
となる。

以下のページから、欲しいバージョンのダウンロードボタンをクリック
http://www.oracle.com/technetwork/java/javase/downloads/index.html


Accept License Agreement のラジオボタンにチェックを入れ、
落としたいファイルを右クリック→リンクのアドレスをコピー

wgetする。
```
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" <コピーしたアドレス>
```

インストール
```rpm -ivh　xxx.rpm```

確認
```java -version```
```java version "1.8.0_151"
...```
Cloudera World Tokyo 2017 登壇&参加メモ

# Cloudera World Tokyo 2017とは?

インターコンチネンタルホテルで開催されたビッグデータ管理と分析の最先端プラットフォームを提供するCloudera が主催するカンファレンス。
1年に1度開催され、今年で6回目。

![c5003f88-e027-416c-a27c-2b707b4a8a6e-1920x1440r.jpg](https://qiita-image-store.s3.amazonaws.com/0/27974/0b5a0dc6-3747-88a8-f39a-04dfe2dca9d2.jpeg)

# Cloudera World Tokyo 2017(CWT2017)まとめ系

* [HP](https://jp.cloudera.com/)
* [togetter](https://togetter.com/li/1169452)

# ~14:20 登壇打ち合わせ、リハーサルなど

# D-2 14:20~15:00 登壇

## Infrastructure as Codeを活用したF.O.Xのクラウドビッグデータ環境の変化

### 資料

[こちら](https://www.slideshare.net/tkmoteki/cwt2017infrastructure-as-codefox-81737686)

### 質疑応答(懇親会含む)

* ジョブスケジューラは何を使ってるか？
* 開発体制のところでIaCの他にどんな事をやれば開発エンジニアの人がインフラ構築を進んでやってもらえるようになりますか？
* S3 Guard 具体的にどんな仕組みで動くのか？
* 何人でその規模、及びそのセッションの内容をやったか？
* クラウドでのClouderaのサブスクリプションってどうなってるのか？
* hadoop環境でのopenstackの検討はしたか？また、採用見送りになったならば、その理由を教えて欲しい。
* hive on s3のwrite heavyなクエリ改善でどのような事をやったか？どんなパラメータをどう変えたか教えて欲しい

# 16:00~16:40 ブース見回り

## 戦利品

ブース回ってゲットしたもの。時間なくて3ブースくらいしか回れなかった

![b0146892-c73d-49aa-957f-4619d4a8065a-1920x1440r.jpg](https://qiita-image-store.s3.amazonaws.com/0/27974/1f44086d-2b41-297d-29ed-0bf7487e89cf.jpeg)

# E-4 Clouderaが提供するエンタープライズ向け運用、データ管理ツールの最新情報と使い方

### 資料

公開待ち

### 内容メモ

* セキュリティ事例
 * mastercard -> PCI認定取得(Hadoopを使用していて初)
* hadoopデメリット
 * データ管理が複雑になる
* メタデータ管理ことビッグデータ基盤の急所
 * メタデータ管理ツール -> Cloudera Navigator
 * 技術メタデータとビジネスメタデータの管理/可視化
 * S3のトレース、監査系可能

### 考察

前半Cloudera Manager。後半Cloudera Navigator。どちらも前から知ってる。
Cloudera Managerは置いといて、Cloudera Navigatorはクラウドでも便利そう(S3)。
特にAWS CloudTrailでやらせていたところを簡単に手間なくやれそう。
CloudTrailはF.O.Xでも設定をずっとまえから導入し、活用出来てないところもあるので、こうゆう手のあると利用が加速するのかもしれない。
ただ、F.O.Xの規模感でここまでやるかなぁというところも感じられるので何とも。


# D-5

## Cloudera AltusとAmazon EMRを比較する

### 資料

公開待ち

### 内容メモ

* 使えるエコシステムを比較
 * Altusはhive/spark/MR/hive on spark
 * EMRの方が多機能? 一長一短
 * EMRは汎用的なクラスタ用途
* 使い方
 * 基本的な仕組みは一緒(タスク、コア、タスク)
 * Altusはジョブベース設計思想(本当にやりたいことはジョブ)
* 実行されたジョブを見る方法
 * Altusはworkload analyticsを使うとすごく便利

### 考察

Altus初心者ならばこちらを資料公開されたら、読んだ方が良い

## Amazon EMR利用者がCloudera Altusを使ってみた感想

### 資料

[こちら](https://speakerdeck.com/swool/amazon-emrli-yong-zhe-kacloudera-altuswoshi-tutemitagan-xiang)

P.17,18は非常に内容が良い

### 内容メモ

* Altusのノード
 * /var/log以下をtd-agentが動いてログ転送をS3にしてた(コメ: なんだと!)
* クラスタシャットダウン後もログ検索が便利(コメ: ClouderaDirectorだと出来ないからなぁ)
* Altusで出来ないこと
 * 複数ジョブの依存を組めない(コメ: いわゆるEMRのmulti streaming steps)
 * APIによる起動(コメ: まじか)
 * ジョブのfork(コメ: なるほど)
 * HiveMetaStoreの永続化(コメ: これはAltusリリース時から言われてる事)
 * クラスタ起動後のworkerのサイズ変更(コメ: まじか)
 * ジョブ失敗時の通知系(コメ: これはAltusでやらなくて良いのでは?)
 * 起動時間20分ほど(コメ: これはAltusのゴールデンイメージpreloadで数分起動可能だと思う)
 * spotインスタンスはworkerのみ(コメ: まじか)
 * SSO/2段階認証(コメ: ふむ)
 * アカウント/請求書を分けたい(コメ: ふむ)
* 結論
 * Altus workload analytics / cloudera managerの存在が大きい

### 考察

Altusは、一度試用をしたことがある。
本番で使うにはEMRと比較すると足りない部分が多すぎるので厳しいと思う。
なので様子見かなぁ。

全体的にありがたい知見だった。Cloudera Directorの時は、顧客事例みたいのググってもなくて、人柱的に調べていたので大変だったので。
Git > tool > DeepGit > code snippetの移動などのhistory確認に使える? | JREを使う

```
Windows 7 Pro (64bit)
SmartGit 17.1.1 #11182
```

http://www.syntevo.com/smartgit/whatsnew
にてSmartGitの新機能を見ていた。

> DeepGit Integration

コード片の移動（同じファイル内、別ファイルへ）のhistoryが追えるとのことらしい。

リファクタリングなどでファイル内関数を別ファイルに移動した時などの履歴が分かれば、将来の保守、機能追加などの作業がやりやすくなると思う。

### 注意点

JRE(Java Runtime Environment)を使用する。

JREを使いたくない場合はインストールを避けた方が良い。

(追記 2017/12/05)
Windows版のSmartGit自体がJREを使っているため、SmartGitをインストールした場合はDeepGitも使うことができる。
Assets.xcassetsに登録した素材がユーティリティエリアのMedia Libraryに表示されない


#環境
Xcode9.1

#詳細
Assets.xcassetsに画像を登録し、登録した画像をMain.storyboardにユーティリティエリアのMedia Libraryから画像を選択し貼り付けようと思ったが、Media Libraryに`no matches`としか表示されない

#解決
Xcode再起動で解決
Foodcritic FC078

```bash
FC078: Ensure cookbook shared under an OSI-approved open source license
```
が発生。
metadata.rbのlicenseが、OSIに承認されたオープンソースライセンスではないため。

しかし、このlicense、

```ruby
license = 'MIT License'
```

と書くと、怒られる。正しくは

```ruby
license = 'MIT'
```

って感じで、どういうフォーマットで書けば良いのか分からない。
以下を見て解決。
https://github.com/Foodcritic/foodcritic/blob/master/lib/foodcritic/rules/fc078.rb#L15L128
PHPでオブジェクト内のプロパティの値を取得

LaravelでDBクエリビルダを使ってレコードを取得した時に、`stdClass`が返って来てて、値だけ欲しいんだけどな〜と悩んでいたけど実は簡単にプロパティの値を取得出来た。

通常は、以下のようにしてプロパティの値にアクセス出来る。

```php
//stdClassを作成 (object型への変換によってstdClassが作成される)
$obj = (object)array('key' => 'value');

//プロパティの値にアクセス
echo $obj->key;//'value'
```

しかし、プロパティのキーが`LAST_INSERT_ID()`のように`()`がついていた場合に、以下のようにするとエラーになる。
`()`がつくとメソッドになってしまい、そんなメソッドは存在しないので怒られる。

```php
echo $obj->key;//Call to undefined method stdClass::LAST_INSERT_ID()
```

その場合は`{}`でくくるとプロパティのキーとして認識してもらえる。

```php
//stdClassを作成 (object型への変換によってstdClassが作成される)
$obj = (object)array('key()' => 'value');

//プロパティの値にアクセス
echo $obj->{'key()'};//'value'
```

以上。
UI > Gmail > よく失敗するところ | 理由と対処

2017年11月9日のgmailのUIについて。
たびたび失敗するUIがある。

## 失敗するUI

受信トレイ > メール選択時
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4879af4c-46ec-aa83-809c-d60d745156ab.png)

すべてのメール > メール選択時
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/82c76b2c-4961-9d83-16cd-946457887b61.png)

違いは「ラベルを付ける」の左側に「移動先:」があるかどうか。

メールの整理のためにラベルをつけたつもりが「移動」していたことがたびたびある。
間違った時点で気づかずに移動されることで、メールを探しにくくなることがある。

## 失敗の理由

### クリックした時に展開されるものが両者で似ている。

クリックと同時に「つけたいラベル」をリストから目で探していると「移動先：」というメニューを見ていない。

### 配置の問題

「すべてのメール」でラベル付けをしていると、そのUIに慣れてしまう。
「ラベルを付ける」は単独で配置されているものと認識してしまう。ある条件でのみ登場する「移動先：」というメニューを間違って選択しているのだろう。

## 自分だったらこうする

「移動先：」と「ラベルを付ける」を離して配置する。
「移動先：」のアイコン表示をやめて「移動」という文字表記にする。
（「受信トレイに移動」と似たような表示になる）。
VS CodeでPHP intellisenseを使おうとしたらPHPモジュールが足りずエラーになった

- Visual Studio Code
- phpbrew
- php7.1.4

という感じで最近PHPの開発を行い始めたのですが、Visual Studio Codeの拡張機能[PHP intellisese](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-intellisense)がどうやらエラーになり全然機能してくれない状態に。

ログを見ると `undefined function hogehoge` みたいなエラーがたくさん出ていました。
最初に出ていたエラーが `undefined function AdvancedJsonRpc\json_decode` となっていたので明らかにおかしい。phpbrew、お前か。

`$ php -m` を実行し、インストールされているモジュールを確認したところやはり`json`関連のモジュールが入っていませんでした。という訳でインストール。

```sh
$ phpbrew ext install json
```

よっしゃーこれで解決！と思ったら、他にも足りないモジュールがあるようでまたエラーが…

結局`json`以外に`ctype`、`filter`の二つも追加でインストールする必要があったのでインストールを実行。

```
$ phpbrew ext install ctype
$ phpbrew ext install filter
```

モジュール群を再度確認。

```
ryosukes ~ $ php -m
[PHP Modules]
Core
ctype
date
dom
filter
json
libxml
openssl
pcre
Phar
Reflection
session
SimpleXML
SPL
standard
tokenizer
xml
xmlreader
xmlwriter
xsl
zlib

[Zend Modules]
```

VS Codeを再起動し解決。快適になりました。

# 追記
コメントにてご指摘ただきましたが、phpbrewでインストールする際、[#variants](https://github.com/phpbrew/phpbrew#variants)の指定がなかったため、個人環境に標準的なモジュールが入っていなかったようでした。

なので、phpbrewでphpをインストールする際には標準的なモジュールを入れてくれる `+default` というvariantを指定してインストールし直してやればよりよくなります。

```
$ phpbrew remove php-7.1.4
$ phpbrew install 7.1.4 +default
```

公式で推奨されてますね。
https://github.com/phpbrew/phpbrew#starting-building-your-own-php
GPL > 別言語移植時のライセンス設定

GPLでのコードを別言語に移植時にはライセンスの扱いはどうなるのか。

### link1: GPL v2.0

https://softwareengineering.stackexchange.com/questions/151515/rewrote-gnu-gpl-v2-code-in-another-language-can-i-change-a-license
> answered Jun 4 '12 at 16:31
Mason Wheeler

https://www.gnu.org/licenses/gpl-2.0.html
の「TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION」の「0」。

同じライセンスにするという認識を持った。

### link2:

https://www.gnu.org/licenses/gpl-faq.html.en#TranslateCode

> **What does the GPL say about translating some code to a different programming language? (#TranslateCode)**

>Under copyright law, translation of a work is considered a kind of modification. Therefore, what the GPL says about modified versions applies also to translated versions.

上記はGPLv3にも当てはまるのかは未消化。
ACS(Kubernetes) whiltelisting

ACS (Kubernetes)のホワイトリスティングについて聞かれたので、ちょっと試してみた。

Nginx ingress controller だとできそうだけど、L4 LoadBalancer でもできるという記述があった。

*[Status of Kubernetes on Azure](https://github.com/Azure/ACS/blob/master/kubernetes-status.md)
* [Source IP whitelisting](https://github.com/kubernetes/kubernetes/pull/36696)

結論からいうと、loadBalancerSourceRanges が使える

```
kubectl run nginx --image nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl edit svc/nginx
```

あたりで編集。{YOUR_IP_ADDRESS}に自分のIPを入れる。[あなたが現在インターネットに接続しているグローバルIPアド](https://www.cman.jp/network/support/go_access.cgi)で調べると良い。

```
spec:
  clusterIP: 10.0.113.195
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 31539
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  sessionAffinity: None
  type: LoadBalancer
  loadBalancerSourceRanges:
    - {YOUR_IP_ADDRESS}/32
```

自分のブラウザからはアクセスできるが、携帯からやると、ちゃんとブロックされる。

ちなみに、こうなると、Express Routeからきた時は、どうなるだろうとか考えてしまう。
またそれは次回以降。
テスト用SNMPTRAPの飛ばし方（Juniper）

# Juniper製品のTRAPの飛ばし方

これだけで、TRAPは飛ぶ。

`request snmp spoof-trap jnxFanFailure` 

だけど、これだとVariableやIndexがめちゃくちゃな値が設定されて飛ぶ。  
おそらく試験TRAPだと分かるようにするため。

そうするとZABBIXの警報トリガーに引っかからない。  
自分の環境では、アイテムのディスカバリをしていて、条件式にSNMPINDEXが含まれているので、正しいINDEXを設定しないと、TRAP受取→警報が確認できない。

## 応用編

というわけで。  
jnxContentsContainerIndex.4.1.1.0 = INTEGER: 4 とかを飛ばしたい時は、こうする。

```
request snmp spoof-trap jnxFanFailure variable-bindings "jnxContentsContainerIndex[4][1][1][0]=4, jnxContentsL1Index[4][1][1][0]=1, jnxContentsL2Index[4][1][1][0]=1, jnxContentsL3Index[4][1][1][0]=0, jnxContentsDescr[4][1][1][0]=Front\ Fan, jnxOperatingState[4][1][1][0]=1"
```
【Java】Streamで要素存在チェック

`Stream#isEmpty`というメソッドは無いので、どう書くのがベストなのかわからなくてQiitaに書きます。


まず普通のときは下記のように書くと思います。

```java
list.stream()
        .anyMatch(条件ラムダ式orメソッド参照);
```

が、今回は、単純に`List#isEmpty`のような判定を`Stream`に対して行いたい場合はどう書くのがいいのだろう？というネタです。

例えば、[Doma2でquery投げて返ってきた`Stream`](http://doma.readthedocs.io/ja/stable/query/select/#id9)に結果があるのか無いのかだけ判定したい、とかで使うかもしれません。

結果、どれがベストかという答えはわからないですが考えたパターンをつらつら書きます。


### anyMatchで常にtrue

初見ではちょっとギョッとするかも。

```java
	boolean notEmpty = stream()
			.anyMatch(e -> true);

	System.out.println(notEmpty);
```

### Iterator#hasNext

説明変数が無いとパッと見何がしたいのかわからない印象。

```java
	boolean notEmpty = stream()
			.iterator()
			.hasNext();

	System.out.println(notEmpty);
```

### Optional#isPresent

うーん。

```java
	boolean notEmpty = stream()
			.findAny()
			.isPresent();

	System.out.println(notEmpty);
```

### count

無駄が多いのでNG。

```java
	boolean notEmpty = stream()
			.count() > 0;

	System.out.println(notEmpty);
```

### 1 or 0 になるようにcount

まだこのほうがマシ。

```java
	//まだまし
	boolean notEmpty = stream()
			.limit(1)
			.count() > 0;

	System.out.println(notEmpty);
```

### toList

これも無駄が多いのでNG。

```java
	boolean notEmpty = !stream()
			.collect(Collectors.toList())
			.isEmpty();

	System.out.println(notEmpty);
```

---

効率的は`Iterator#hasNext`のパターンが良いんですかね？（特にDoma2で使うなら）
その場面にあったら何も考えずに一番簡単そうな`anyMatch(e -> true)`で書いてしまうかな。
会議を有意義にし、しかも時間を短縮し、業務に費やす時間を増やそう。

# 会議を有意義にし、しかも時間を短縮し、業務に費やす時間を増やそう。

どこの現場でも、タラタラと無駄に長い会議。
『この会議にこの人は必要？』と思うような会議。
週の1/3ぐらいが会議と本末転倒なプロジェクト等々。

そもそも、会議の目的は、意思決定し、行動し、結果を出すことである。
なので、会議を有意義にしかも時間短縮し、業務に専念できるようルールを予め決めることが重要と考える。

1. 会議を30分以上やることは無駄
 - その会議で何を話すか（議題を決める）
 - その会議に参加する人は何人か（その議題に関連する人を集める。みんなに関連するなら全体。チームならそのチームのメンバー）
 - このふたつを考慮してその会議は何分でおわるのかを決める事が重要だと思う。

2. 会議を週に何度もやるのは無駄
 - 重要なのは反復という概念で、例えば「今日から来週までにこれだけのことをやる」っていう期間を決めること。それが定例会議になるし、継続しやすい。

3. 会議を大人数でやるのは無駄
 - 人はプロジェクトに時間を割くことでプロジェクトの完成度があがる。
つまり会議に時間をいくら費やしてもプロジェクトは一向に進まない。
 - 会議では短くを終わらせて、それぞれその会議で発生したタスクを遂行させるのがプロジェクトの完成度を高めるを方法なのだ。

##  会議でいい議論をするためには

1. 会議の目的が明確なこと。
2. 議論するポイントが明確であること。
3. 参加者一人ひとりが、議論する事項や背景などを熟知していること。
4. 互いに違った視点が導入できること
5. 事前に展開された情報を把握すること
などが不可欠の要素だ。

### 議題 (アジェンダ)項目例

- 主題：
- 開催日時：
- 開催場所：
- 会議リーダー・決定責任者：
- 検討するべき決定事項：
- 会議参加者：
- 読むべき必要書類（すべて打合せ案内メールに添付済み）
- 目的：
- 現在の問題点：
- これまでの経緯：

### 議事録

話した内容を実行にうつすために必要なのは

- 誰が
- 何を
- いつまでに(いつ開始するのかも必要)
- なぜ
- どのようにするのか

**※できれば、議題(アジェンダ)に結果を書き込めるスペースを用意し、
結果を埋めるだけ(心理的要因)で議事録となるように工夫するとさらによい。**

### 会議出席者に対しての依頼事項

会議体を有効利用するために以下を順守するよう、会議案内にて展開する。

1. 定刻に会議に参加すること。
2. 会議中に取り留めなく無意味に話したり、議論を脇道にそらしたり、止めたり、メンバーを責めたり、攻撃したりしないこと。
3. 説得力のある議論が行われた場合は、自身の考えや視点を変えること。
4. 個人ではなく、部署やグループなどのチームのために努力すること。
5. 確実に行動することを確定し、業務が完了するまで責任を持って支援すること。
6. 自分自身が会議に何の付加価値ももたらさないと感じた場合は、躊躇なく出席を取りやめること。
7. 会議が意義ある議論の場になるよう、事前に十分な時間を使って準備を行うこと。
8. 意見を否定するなら代替案を提示すること。
9. カタカナ、英語など自分は分かっていても相手が理解できるとは限らないので、分かりやすい日本語を使用することを心がけること。(不明瞭な伝達は、期待する結果にはならないため)

### 各会議の実施内容、参加者

1. 週次定例会議（週１回）
 - 内容：進捗状況、問題／課題の確認と解決状況、対策案の妥当性検証
 - 参加者：　各PM、各PL、PMO担当者
 - 開催者、進行：PMO

2. マネジメント会議
 - 内容：状況報告、重大課題、今後の主要マイルストーン
 - 参加者：部長、PMO、各PM
 - 開催者、進行：PM

3. プロジェクト間会議:チーム間会議
 - 内容：各プロジェクトの進捗確認、 横断課題、今後の進め方
 - 参加者：各PM、各PL 、PMO担当者
 - 開催者、進行：PL

4. プロジェクト内会議 ：チーム内会議
 - 内容：プロジェクト内進捗・課題・問題管理
 - 参加者：各プロジェクトメンバー
 - 開催者、進行：各チームリーダー

5. その他の会議
 - 内容開発局面に応じて以下の会議体を設定しPMOにて管理する
 - 設計・課題検討・問題点検討
 - 設計レビュー

-------

## 進捗会議には、「状況報告」「問題解決」という2つの側面がある。

技術者の中には、「問題解決」のためなら喜んで手を貸し、そのための時間は惜しまない人が多いように思う。
しかし、彼らは往々にして、単なる「状況報告」を好みません。
「そんな退屈な時間は無駄！ それだったら仕事させろ！」という意見をよく聞きます。（特に、技術者として優秀な人ほど、そういう傾向があると感じます）。

であるなら、進捗会議は「問題解決」に重点を置いてみてはいかがでしょうか。
まず、PMはあらかじめ個々のメンバーから進捗状況を吸い上げておき、問題点を聞き出しておきます。
次に、全メンバーを集め、その問題点について話し合うわけです。
「状況報告は個々に、問題解決は会議で行う」という方式です。

これなら、メンバーが拘束される時間は最小限で済みます。
状況報告に付き合わされてテンションが下がることもない。
PMはちょっと大変ですが、メンバーにはメリットの多い方法です。

また、メンバーに進捗状況をヒアリングする際は聞き方にも注意する必要がある。
    NG
    「進捗率を報告してください」
    OK
    「この工程はいつ終わる？」
    「予定の工数と比べてどのくらい増えそう？(分母が増えたのかを確認する)」
    「追加でどんなタスクが発生してる？」
【MAC】幸せになれるGoogle日本語変換設定〜日本語と半角英数混在入力〜

# 事の始まり
**日本語入力中に半角英数文字を打つのが面倒**

MacBookPro2016を買って困った問題がこれ。
　

これは「TouchBar」になったため、ファンクションキーない
＝＞日本語入力の際にF7を押して半角英数にできない
というもの。

Ctrl+: で変換すればいいのですが、F7を押すだけだったときに比べるとちょっと・・・かなり面倒。

というわけで調べてみたら、Google日本語変換の設定で、#などの記号や英数文字は日本語入力中でも半角英数入力が可能なことが判明。

# 設定方法

①Google日本語変換の「環境設定」をクリック
![スクリーンショット 2017-11-09 7.48.52.png](https://qiita-image-store.s3.amazonaws.com/0/211107/3d0a96fa-3969-0798-0771-9f2c80091b9a.png "スクリーンショット 2017-11-09 7.48.52.png")


②「入力補助」をクリック
③半角全角のなかから、アルファベットを選び、「変換前文字列」を全角から半角に変える
![スクリーンショット 2017-11-09 7.45.21.png](https://qiita-image-store.s3.amazonaws.com/0/211107/acf9922e-49f7-2e38-0ae4-726d83592a79.png "スクリーンショット 2017-11-09 7.45.21.png")

とりあえずの設定として、「アルファベット」「数字」「#%&@$^_|`\」「<>=+-/*」あたりを半角にしてみて様子見中。


これを変えただけでもかなり日本語変換のストレスが減りました。


参考にしたサイトはこちら
https://number333.org/2013/03/02/google-japan-input/
TikZ 内からの \zsavepos

TikZ の `\node` 内で `\zsavepos` を行った場合，

* pdfTeX, LuaTeX : `\node` の出力位置を正しく取得できる。
* XeTeX, pLaTeX+dvipdfmx : `\node` の出力位置を正しく取得できない。（常に`tikzpicture`の原点座標になる模様）

これは PGF のドライバファイルに起因する問題？

# 検証

TeX Live 2017 の最新版で検証。
各々2回コンパイルするものとします。

## pdfLaTeX

### ソース
```latex
\documentclass[pdftex]{article}
\usepackage{tikz}
\usepackage{zref-savepos}
\begin{document}
\begin{tikzpicture}
\node[draw,circle] at (0,0) {\zsavepos{A}};
\node[draw,circle] at (1,1) {\zsavepos{B}};
\node[draw,circle] at (3,3) {\zsavepos{C}};
\end{tikzpicture}

\typeout{(\zposx{A},\zposy{A})}
\typeout{(\zposx{B},\zposy{B})}
\typeout{(\zposx{C},\zposy{C})}

\typeout{(\the\numexpr\zposx{B}-\zposx{A}\relax,\the\numexpr\zposy{B}-\zposy{A}\relax)}%% A→B
\typeout{(\the\numexpr\zposx{C}-\zposx{B}\relax,\the\numexpr\zposy{C}-\zposy{B}\relax)}%% B→C
%%%% ⇒ 後者は前者の2倍のベクトルのはず

\end{document}
```

### 出力結果(OK)
```
(10104593,37973387)
(11969272,39838066)
(15698630,43567424)
(1864679,1864679)
(3729358,3729358)
```

## LuaLaTeX
### ソース
```latex
\documentclass[luatex]{article}
（以下同じ）
```

### 出力結果(OK)
```
(10104593,37973387)
(11969272,39838066)
(15698630,43567424)
(1864679,1864679)
(3729358,3729358)
```

## XeLaTeX
### ソース
```latex
\documentclass[xetex]{article}
（以下同じ）
```

### 出力結果(NG)
```
(10104593,37973387)
(10104593,37973387)
(10104593,37973387)
(0,0)
(0,0)
```

## pLaTeX + dvipdfmx
### ソース
```latex
\documentclass[dvipdfmx]{article}
（以下同じ）
```

### 出力結果(NG)
```
(10104593,36831094)
(10104593,36831094)
(10104593,36831094)
(0,0)
(0,0)
```
中学３年生の自由研究

初めまして！Soheiと申します:smile:
中学３年生で、来年の春高校に入学します。
プログラミングの記事を載せたいと思っています。
プログラミング経験はまだ一年もなく、ど初心者をやってます（笑）
初めての投稿なので色々と拙いですがご容赦を:disappointed:
#なぜ記事を載せようと思ったの？
今回この記事を載せようと思った理由は**2つ**あります。
一つはプログラミングをやる身として**自分に情報を公開するという使命がある**と感じたからです。
二つ目は僕と同じ中学生のzenboさんという方の[記事](https://qiita.com/__zenbo__/items/aeba6c9eb098193a6efc)を読み、感化されたからです。

#目標は？
最近「サイバー攻撃で国の情報が盗まれた」や「個人情報が盗まれた」というニュースをよく耳にします。そんな世の中で今求められている人材は情報を守ることができるいわゆるWhite Hackerと呼ばれる人材です。僕の遠い目標はこの**White Hacker**という職業にになるということです。そのために今はpythonの勉強やコンピューターセキュリティ技術を競うCTF(キャプチャー・ザ・フラッグ)の勉強をしています。

#最後に
次回からプログラミングの記事を載せたいと思っています。
拡散してもらえると嬉しいです。
間違っているところなど色々あると思いますが何かアドバイスなどがありましたらなんでもコメントにお書きください。
これからよろしくお願いします！

P.S
新しい記事を書きました
よかったらこれもどうぞhttps://qiita.com/akaoni_sohei/items/6d694d73de9da3d8f2df