OmniAICreator/Qiita-1.07M huggingface dataset:
Google Cloud Platformでデータを安全に保存する

Google Cloudには、kmsという秘密鍵を用いた暗号化・復号を煩雑にすることなく行うことができるマネージドサービスがあります。

職掌分散を保ちながらセキュリティを担保することができます。

また、鍵の更新スパンを設定することにより、古いファイルの秘密鍵を保存したまま、新しい秘密鍵へと随時更新することができます。古い鍵は明示的に破棄されない限り有効状態であり、gcloud kmsコマンドを用いて、暗号化する場合は、自動で最新の鍵を使用して暗号化し、復号の際は自動で暗号化時の鍵を使用して、データを復号します。

ただし、鍵の寿命を小さくすることで、不正ファイルアクセスに対する安全性を高めることができることから、本当に厳重な保管が必要とされる重要なファイルに関しては鍵は更新のタイミングでファイルを復号し、常に最新の秘密鍵で再暗号化をかけるのが良いです。この手順は、各言語のAPIやgcloudコマンドを利用して自動化することができます。

keyringはnamespace、keyNameはkeyring内での鍵の識別子の働きをします。keyring,keyNameおよびkeyのバージョンによってkmsは、秘密鍵を一意に保存しています。gcloud kmsコマンドでは、versionにおいては、暗号化においては明示的に指定がない場合は自動で最新版が、復号においては、自動的に暗号化した時の公開鍵（対称暗号の場合）に対応する秘密鍵を選出して復号してくれます。

```sh：暗号化
gcloud kms encrypt --location global --keyring $keyringName --key $keyName --plaintext-file sample.txt --ciphertext-file sample.txt.enc
```

```sh:復号
gcloud kms decrypt --location global --keyring $keyringName --key $keyName --plaintext-file sample.txt --ciphertext-file sample.txt.enc
```

これら暗号化したファイルは特定のgoogleアカウントのみでgcsログインできるようにしたGCSなどで保管しておくことで、普通のファイル共有を行うよりも強固にファイル共有ができるほか、ファイルが設定の誤りなどで流出してしまっても、管理者アカウントで鍵を無効にすることで暗号の強度と同じ難易度まで解読を困難にしファイルを守ることができるようになります。

また、この際、鍵を管理するアカウント、鍵を使うアカウントやプロジェクトを別々に用意することで、サービス運用に関わる操作と鍵の管理は別権限にすることで、鍵自体の一元管理や、必要以上にプロジェクトの鍵作成の管理者が増えて、漏洩するリスクが高まることや、どちらかのアカウント情報が漏洩してプロジェクトにログインされてしまった場合でも、鍵の漏洩だけではgcloudコマンドの復号権限がない。Storageのアカウント情報だけでは、鍵を取得できないので、復号ができないというような状態を作り出すことができ、ワークフローさえ整えてしまばより強固かつ、管理が容易なセキュリティマネジメントができるようになります（職掌分散）。

僕らの開発チームではこれらの技術によって本当に漏洩してはいけないファイルは確実に機密を保護できる状態になることを義務付けています。

これらの操作は自前でopensslの安全性を担保しながら同じような仕組みを運用するのに比べ、非常に楽に実現ができます。なかなか地味なサービスですが、非常に有用なので、SLAでシビアな情報管理が求められるような開発では、ぜひ、ベストプラクティスを探ってみるといいと思います。

今年は担当分全記事乗り切った...！！！
【GAS】シートにおけるアクティブの定義

####この記事はGoogleスプレッドシートにおける、アクティブシートの定義について解説した記事です。(18.12.24)

#結論
~~アクティブシートとは、スプレッドシートの一番左側にきているシートを指すのではないかと仮説が立った。
詳しい人のアドヴァイスを求む。~~
追記（2019.5.14)
getActiveSheet()をスクリプトエディタから直接実行すると、一番左側にあるシートを取得するが、シート上からボタンに割り当てた関数を呼び出すとそのボタンが存在するシートが取得される。また、セルの値が変更された際にトリガーが呼び出される場合は、変更されたセルが存在するシートが取得される。

##前置き

GASを使ってスプレッドシートのカスタマイズをしていたのだが、普段はシート名を指定してシートを取得していたためあまり気にならなかったが、「アクティブシート」でシートを指定しようとした際に、「アクティブ」の定義が気になったため調べてみた。

**対象：これからGASを使ったスプレッドシート開発をしようと思っている方**
アクティブシートの取得はスプレッドシートを使った開発の基本中の基本であり、万人が避けては通れない知識かと思われますのでぜひ一度めを通していただけるとよろしいかもしれません。

(この記事は間違いを含んでいる可能性がありますので、スプシに詳しい方は間違いを見つけ次第訂正していただけると助かります。)

##公式レファレンス

まずはgetactivesheetメソッドに関する公式レファレンスを確認してみる。→[公式レファレンス](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getactivesheet)

**【公式レファレンス】**(18.12.24)
>The active sheet in a spreadsheet is the sheet that is being displayed in the spreadsheet UI.

**【訳】スプレッドシートにおけるアクティブシートとは、スプレッドシートUI内に表示されているシートのことである。**

**スプレッドシートとはクラウドツールであり、複数人で開くことができるため、これだけだと、誰のUI(ウィンドウ)で開かれているシートを指しているのかわからない。また、直感的に公式レファレンスが定義する「アクティブシート」と実際の「アクティブシート」は異なる気がした。**

一応アクティブシートの定義に関する他の記事も読んでみた。→[【active sheet/cell definition】](https://www.lifewire.com/active-cell-definition-3123375)
>The active cell is also known as the current cell or the cell that holds the focus of the cursor.
~中略~
Similarly, the active sheet or current sheet is the worksheet containing the active cell. 

つまるところ、アクティブセルとはカーソルで選択しているセルのことを指し、アクティブシートとはそのアクティブセルを含むシートを指すようである。

##検証
実際にアクティブシートが定義通りなのか検証してみた。
GASを用いてスプレッドシートの開発を行う際、スプレッドシートに紐づけられたスクリプトファイルと独立したスクリプトファイルの二つを用いることができるが、今回は独立したスクリプトファイルを利用して検証した。
(ウィンドを二つ開き、片方ではスプレッドシートを開き、もう片方ではスクリプトファイルを開いている。)

テスト用のスプレッドシートを作り、IDで指定して呼び出す。
getActiveSheet()メソッドで呼び出すことができるシートを、アクティブセルを変えながら検証する。
<img width="674" alt="スクリーンショット 2018-12-24 22.04.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/331368/c0c68d67-7cac-8912-8e0a-3ea08ef3b466.png">

##結果
<img width="454" alt="スクリーンショット 2018-12-24 22.09.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/331368/e11e226d-2382-51b2-4a88-c2ea592be3b9.png">
<img width="454" alt="スクリーンショット 2018-12-24 22.10.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/331368/1723f6be-9ae3-5ead-9b06-d3c22daffc25.png">
<img width="454" alt="スクリーンショット 2018-12-24 22.10.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/331368/3197be23-9ddb-4049-a0cd-80f6023ec49b.png">
<img width="454" alt="スクリーンショット 2018-12-24 22.10.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/331368/416f0830-d34b-8aee-f90a-71fc425d1424.png">

アクティブセルがシート１にあるとき、シート２にあるとき、両方でmufunctionの実行ログ上ではシート１が表示された。

##仮説
<img width="378" alt="スクリーンショット 2018-12-24 22.15.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/331368/a8c7baf5-614f-d34e-a282-c85962d8783f.png">
<img width="378" alt="スクリーンショット 2018-12-24 22.16.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/331368/28dd3107-1329-ef91-4ab7-da1c27f69b91.png">

シート2を一番左側に置くとシート２がアクティブとして認識された。
また、もう一度シート１を左側に戻すと、シート１がアクティブシートとして認識された。
さらに、３つ以上のシートを作成して検証したが、やはり一番左側にきているシートがアクティブシートとして認識された。
（その他、セルを選択するだけでなくデータを入力してみたりしたが結果は同じだった。）
以上から、**アクティブシートとはスプレッドシートの一番左側に位置するシートを指すのではないかという仮説が生まれた。**
ChromeOS/Chrosini で Docker を最新にしたら動かなくなったけど動いた

# 現象
そもそも動くはずの Android アプリが動かなくなってしまっていたので，Power Wash して，以下のように Docker 開発環境を構築しようとした．

```Bash
sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

sudo apt-get update
sudo apt-get install docker-ce
```

## しかし動かない！
```
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

# 解決？
そんなものはすでに困っている人がいて，Redditの議論でも解決を見ていない．
https://www.reddit.com/r/Crostini/comments/9vpm0j/new_docker_errror/
このエラーは新しい Docker でのみ起こり，ロールバックすれば行けるようなことが書いてあった．しかたないので，書いてあるとおりに

```Bash
sudo apt-get install docker-ce=18.03.1~ce-0~debian
```

したら動いた．
今までに読んだ本、のうち、覚えているものリスト

こちらに移動しました。
[今までに読んだ本、のうち、覚えているものリスト](https://qiita.com/moonWalf/items/4f9eb8865c0b74f2280f)

# 読んだ本リスト  

全然覚えてないなぁ。
思い出せたものだけ。
絶版になったものもあるかも。  

## 技術系  

具体的なコードの本(C#とかPythonとか)が少ないのは、
あまり本で勉強しなかったから...。
知らないコードを読む、解析する、触ってみる、考える、理解する。
ひとつ言語がわかるようになると、あとは入門書なくても大丈夫だと思う。
ただし、ASP.NETやRailsみたいなのはコードではなくて仕組みなので、
知らなければ入門から学んだほうがいいと思う。
だたこれもまた、Railsが分かればASP.NETもDjangoも大体、わかると思う。

### 全般的な知識系

直接的に役立つというよりは、間接的に役立つ知識。
そしてコーディングの生産性は案外、こういう間接知識に左右されたりする。  

- プロダクティブ・プログラマ
- エンジニアのための時間管理術
- リーダブルコード
- オブジェクト指向でなぜつくるのか
- プログラムはなぜ動くのか
- 暗号技術入門 第3版　秘密の国のアリス
- 正規表現技術入門 ――最新エンジン実装と理論的背景
- アジャイル・サムライ  

### WEB・ネットワーク系 

インフラ系でなくても、最低限度の知識を知っておくと役立つ。
基礎を知っておくと、解決方法のアイデアが増えると思う。 

- 3分間ネットワーク基礎講
- 3分間HTTP&メールプロトコル基礎講座
- Webを支える技術 -HTTP、URI、HTML、そしてREST

### DB・SQL系

Web系ならあんまりいらないかな...と思ったけど、
データ解析やAIが出てきてるし、処理速度にも大きく影響するし、
SQLやDBの知識はあったほうがいい。
SQLは分析関数くらいまで理解できれば十分だと思う。
[理論から学ぶデータベース実践入門]までは読まなくてもいいと思う。

- SQL 第2版 ゼロからはじめるデータベース操作
- SQL実践入門──高速でわかりやすいクエリの書き方 
- 理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL

### Java

具体的にやったのはこれぐらい。とても良い本。
著者の結城浩さんの本はどれも良い本なのでオススメ。

- Java言語プログラミングレッスン 第3版

### Python

細かい面倒ごとを自動化。
環境に問題が無いなら、Rubyでもいいと思う。

- 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

## クリエイティブ系  

世界は思っているより広い。
せめてデザインの基礎くらいは抑えておいたほうがいい。
デザイナーと仕事をするときに役に立つし、
デザインに関する考え方は応用範囲が広い。

- クリエイティブ・マインドセット 想像力・好奇心・勇気が目覚める驚異の思考法
- デザイン思考が世界を変える (ハヤカワ・ノンフィクション文庫)
- 誰のためのデザイン？　増補・改訂版
- ノンデザイナーズ・デザインブック [第4版]
- なるほどデザイン〈目で見て楽しむ新しいデザインの本。〉
- 佐藤可士和の超整理術
- 問題解決ラボ――「あったらいいな」をかたちにする「ひらめき」の技術
- アイデアのつくり方
- デザインのデザイン

## 人に伝える系

エンジニアは、非エンジニアと話をする機会も多い。
最低限、伝わる文章がかけるといいね。

- 数学文章作法 基礎編
- 理科系の作文技術
- 伝わる・揺さぶる!文章を書く
- 話すチカラをつくる本
- あなたの話はなぜ「通じない」のか

## その他読み物系

役に立つとか、立たないとか、まぁ置いといて。
面白かった本。

- 職場で、家で、学校で、働くあなたの疲れをほぐす すごいストレッチ
- いかにして問題をとくか
- 人工知能は人間を超えるか ディープラーニングの先にあるもの
- コンテンツの秘密 ぼくがジブリで考えたこと (NHK出版新書)
- 角川インターネット講座 (1) インターネットの基礎情報革命を支えるインフラストラクチャー
- 上達の法則―効率のよい努力を科学する
- 諦める力 〈勝てないのは努力が足りないからじゃない〉
- 大局観 自分と闘って負けない心
- 決断力
- 直感力
- 海馬　脳は疲れない
- 単純な脳、複雑な「私」 (ブルーバックス)
- 進化しすぎた脳―中高生と語る「大脳生理学」の最前線
- のうだま1 やる気の秘密 (幻冬舎文庫)
- 脳には妙なクセがある (新潮文庫)
- 平常心を鍛える 自衛隊ストレスコントロール教官が明かす「試練を乗り切るための心の準備」
- ゼロ―――なにもない自分に小さなイチを足していく
- 脳科学は人格を変えられるか?
- 世界一やさしい問題解決の授業―自分で考え、行動する力が身につく
- 投資家が「お金」よりも大切にしていること (星海社新書)
- 数学ガールシリーズ
- 昭和史(半藤一利)
- ファスト&スロー(上) あなたの意思はどのように決まるか? (ハヤカワ・ノンフィクション文庫)
【python】メルカリ再出品ツールを作ってみた

![iphone8IMGL7772_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/307312/121bfe5c-3819-3770-fd26-8024ad09e840.jpeg)

もう今では使ったことがない人はほとんどいないんじゃないかと思うくらい浸透しているフリマアプリ。かくいう自分も2，3年前から「メルカリ」を使って売買をしています。主に読み終わった本とか買い過ぎたグッズやらなんやら…
フリマアプリはメルカリ以外にも「ラクマ」「ジモティー」やら沢山あります。いずれラクマとか始めてみようかなぁ

メルカリにしてもラクマにしても、利用者はかなりの人数がいると思います。（ラクマは楽天になってからCMも随分頑張ってるし。）
でも人が多いので買おうと思っていたものがちょっと目を離すと他の人に購入されてしまったりなんてことは良くあることです。
商品を出品していてもすぐに売れると有難いですが、なかなか売れないと商品の管理も大変でさらに、他の人がどんどん出品するので自分の商品はどんどん埋もれていってますます売れなくなっていく始末orz
そうなってしまうと、どんなにものが良くても売れなくなってしまいます。

じゃぁ、どうすれば売れやすくなるか？というとメルカリの場合はいくつか方法があります。
**①　「値段を下げる」**
これはどういうことかというと、値段を下げると目立つとかいう事ではなく、メルカリでは「約１０％下げる」と上位に表示される可能性がある、という事です。でも確実性はないのと本当に１０％かどうか？という疑問があります。それに売価が高くない商品は１０％も下げてしまうと発送とか手間のほうがかかってしまいます。せっかく売るのなら高く売れる方がいいですよね。
**②　「再出品する」**
これはそのままですね。既に出品している商品を停止か削除して同じ内容で新たに出品しなおす方法です。これであれば値段はそのままで上位に表示されます。そのかわり新たに出品するので値段を変更するよりも手間はかかります。

正直なところ「どっちもめんどくさい」です。
じゃぁ、どうするか？

**「面倒なことは自動化しちゃいましょう」**

という事で作りました。
「python」＋「selenium」で。
あ、メルカリは基本botツール類は非推奨です。使いすぎには注意です。

やっていることは至極単純です。
**①　メルカリへログイン**
**②　現在出品中の商品情報取得**
**③　出品中の商品を停止して新規出品する**
**④　ユーザー名とパスワード入力と保存**
の4つの処理をやっています。

画面はいたってシンプルです。メニューボタンとchromeの画面が表示されるくらいです。
![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/307312/506e0c80-aa5e-2aa1-335d-de66befeaaef.jpeg)

左から①→④まで順番にできるようにしています。
出品中の商品情報とユーザー名、パスワードはDBに保存。あと必要な情報（例えばカテゴリとか発送地域）なんかもDBに入れて、出品画面で選択するのに使ったりします。
する事は基本的にクローリングとスクレイピング、それに画面の項目選択と入力のみです。

やっている事は単純なのですが、意外に困ったことがいくつかありました。
取得するのにXPATHで出来なかったり、カテゴリ数が多くて必須項目の組み合わせが多かったりw
あと最後にexe化するんですが、自分はpyinstallerで作成しています。その時に通常の「pyinstaller *****.py -F -w」とかで作成しても実行できなかったんです。で何故かと考えると今回は「selenium」を使っていたので「--hidden-import selenium」のオプションがないと正常に実行ファイルが作成できないという問題が…
この辺りはファイルが出来てから、いざ実行して初めて起きる現象なのでその時にならないと分からない、且つエラーメッセージを見てもよく分からない。という困った問題なのです。ハマるとかなり時間とられますorz

とにかく実行ファイルも出来たので、これで埋もれた商品を再出品して目に留まりやすくなれば売れる確率は上がりますね。
そのうち出品機能とかも追加したいけど、次に作りたいものがあるので後回しですね。

もし、気になった人がいればココナラで販売もしているので見て貰えると喜びます。
購入してもらえると更に喜びます。

<a class="coconala-widget" href="https://coconala.com/services/689307" data-service_id="689307" data-width="468" data-comment="0" data-invite="1" data-user_id="679174">メルカリ出品補助ツール販売します 他に埋もれて売れにくい？、上位になればワンチャンありますよ</a><script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://coconala.com/js/coconala_widget.js';fjs.parentNode.insertBefore(js,fjs);}}(document,'script','coconala-wjs');</script>
NetBeansのJava11対応版をビルドインストールした話


### Javaとantのインストール（Java8とJava11が必要）
---

```bash
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 11.0.1-open
sdk install java 8.0.191-oracle
sdk use java 8.0.191-oracle

sudo apt install -y ant

```

ビルドするためには、Java8が必要。
動作はJava11で行うため、両方インストールする

お手軽なのでインストールには、sdkmanを使用した。

### NetBeansインストール
---

```bash
cd
curl -o- https://codeload.github.com/apache/incubator-netbeans/tar.gz/10.0-vc5 > incubator-netbeans-10.0-vc5.tar.gz
tar -xvf incubator-netbeans-10.0-vc5.tar.gz
cd incubator-netbeans-10.0-vc5
ant -Dcluster.config=full
sdk use java 11.0.1-open
```

ビルドは6コアのPCで12分くらい掛かった。
普通のPCなら、最低30分ぐらいは掛るかも。

### コンフィグファイル編集後、起動！！
---

```bash
cd ~/incubator-netbeans-10.0-vc5/nbbuild/netbeans/etc
# netbeans_default_options の後ろに追加!! アンチエイリアスとデフォルト文字コードUTF-8
# -J-Dawt.useSystemAAFontSettings=on -J-Dfile.encoding=UTF-8
# jdkhome設定　フルパスの必要があるらしい
# netbeans_jdkhome=/home/hoge-user/.sdkman/candidates/java/11.0.1-open

# 起動！！
ant tryme

```

### さいごに
---

NetBeansが、いつの間にかOracleからApacheに移籍していた。

なんか開発が活発に見えるので大いに期待できそう。

でも、みんな `IntelliJ IDEA` 使うだろうから、興味ないだろうなぁーとは思う。

まぁ、結果を出すなら何を使っても良いのですよ。

どうでもいいけど、sdkmanはなんとなくで使えるのでセンスが良いコマンド使いが開発している気がする。

僕との相性が良いだけかもしれないが。。
UnityとARkitで電脳コ◯ルなアプリを作った

Unityで作成した「ARちゃんねる」という、ARアプリで使用した技術などについてご紹介します。

### 今回以下のアドベントカレンダーにも投稿しました
・Unity Advent Calendar 2018：Unityでの水彩画風ポストエフェクト
https://qiita.com/awesome/items/3483cbea779909ab9814

# 作成したARアプリ
![oge.png](https://qiita-image-store.s3.amazonaws.com/0/59095/942fc91f-744d-0379-cd33-f22ce8107da2.png)
Emoji icons provided free by <a href="https://www.emojione.com/"target="_blank">EmojiOne</a>
イメージ的にはAR版2ちゃんといった感じです…！(名前からもわかると思いますが)

### 以下Twitterに投稿した紹介動画です
<!-- https://twitter.com/awesome_now/status/1076824747957252097 -->

# Unityでの開発で思ったこと
Unityで何度かアプリケーションを作ってきましたが、UIをしっかり作ったのは今回が初めてでした。
UnityはUIまわりが貧弱なイメージを勝手に思っていたのですが、公開されているコンポーネントなどのおかげで、かなりサクサク作れました！

# UnityのARkitプラグイン
以下からダウンロードできます。
https://bitbucket.org/Unity-Technologies/unity-arkit-plugin

# サーバーサイドの実装はRuby on Rails
サーバーサイドはRuby on Railsで実装し、
コメントや絵文字は緯度経度つきで保存しています。
取得する場合は緯度経度のminとmaxを指定して取得します。

### Twitter、Facebookログインはomniauthで実装しました。
https://github.com/omniauth/omniauth

# 絵文字の表示
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/03eac1c3-fef9-82f1-8821-601a629582fd.png" width="300">
EmojiOneという絵文字のライブラリを使用しました。
https://www.emojione.com/
フリーライセンスなら、コピーライトを載せることで利用することができます。


# スライドショーの表示
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/56705331-6e28-caae-2bcc-31346e81b82e.png" width="300">
https://bitbucket.org/ddreaper/unity-ui-extensions
unity-ui-extensions内のScrollSnapRectを使用しました。

# WebViewの表示
<img src="https://qiita-image-store.s3.amazonaws.com/0/59095/a46b07d8-0ad8-a927-6bcd-666a6f53f3a1.png" width="600">
地図の表示やログイン画面はWebViewで表示しています。
GREE様製のunity-webviewを使用しました。
https://github.com/gree/unity-webview

### 地図の表示について
地図はOpenStreetMapをleafLetというJavaScriptライブラリでブラウザで表示しております。

# 最後に
とにかくさっさとアプリを公開して改善していくフェーズに入りたいです！
Chrome拡張機能で戸〇呂タイマーを作った

#どんなアプリ？
　1993年、暗黒武術会決勝にて敗死した戸愚〇（弟）の現況をお伝えするアプリです。

#何を表示するの？
　あらゆる苦痛を一万年かけて受け続け、それを一万回繰り返して消滅する予定の〇愚呂(弟)氏が、
　あとどれくらいで完全な無になるかカウントダウンします。
　完成形はこんな感じです。
![togroTimerCapture.png](https://qiita-image-store.s3.amazonaws.com/0/42223/3800bac5-8afd-6295-1759-6ac603d7c552.png)

#なぜ作ったの？
 HelloWorldって表示するだけなのもアレなんで。

#注意事項
　※何月何日に開始したかが分からないため、年単位での表示となります。
　※将来的に、javascriptのDate型が西暦1億1993年まで正しく処理できるようにアップデートされる事を期待した実装となっています。
　もしjavascriptまたはDate型がオワコンとなりアップデートされなくなった場合、正しく年数を判定できなくなりますのでご注意ください。

#謝辞
　Chrome拡張機能を作るのが初めてなので、@k7a氏のこの記事を見ながら作りました。
　https://qiita.com/k7a/items/26d7a22233ecdf48fed8
　@k7aさんありがとうございます。

#フォルダ構成
　-TogroTimer
　└manifest.json
　└togro.html
　└togro16.png
　└togro19.png
　└togro48.png
　└togro128.png
　└js
　　└togro.js

#ファイル

-manifest.json

```json:manifest.json
{
  "manifest_version": 2,
  "name": "Togro Timer",
  "version": "1.0",

  "description": "Timer to wait for completely vanishment of Togro(little brother)",
  "icons": {
    "16": "togro16.png",
    "48": "togro48.png",
    "128": "togro128.png"
	},

  "browser_action": {
    "default_icon": {
        "19": "togro19.png"
    },
    "default_popup": "togro.html"
  }
}
```

-togro.html

```html:togro.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>戸〇呂タイマー</title>
<style>
  body {width: 200px; }
  .tarNum { color: red; }
</style>
</head>
<body>
<p>【現在の戸愚〇】</p>
<p>冥獄界<span class="tarNum" id="meigokuCount">0</span>回目の</p>
<p>開始後<span class="tarNum" id="meigokuYears">0</span>年が経過しました。</p>
<p>残り<span class="tarNum" id="meigokuYearsLeft">0</span>年と</p>
<p>10000年×<span class="tarNum" id="meigokuCoutLeft">0</span>回です。</p>
<br>
<p>達成率100%中の<span class="tarNum" id="percent">0</span>％!!!</p>
<script src="./js/togro.js"></script>
</body>
</html>
```

-togro.js

```js:togro.js
var START_YEAR 		= 1993;
var MEIGOKU_YEARS 	= 10000;
var MEIGOKU_COUNT 	= 10000;
var currentYear 	= new Date().getFullYear();

var meigokuCount 	= Math.floor(( currentYear - START_YEAR ) / MEIGOKU_YEARS);
var meigokuYears 	= ( currentYear - START_YEAR ) % MEIGOKU_YEARS;

document.getElementById('meigokuCount').innerHTML 		=meigokuCount + 1;
document.getElementById('meigokuYears').innerHTML 		=meigokuYears;
document.getElementById('meigokuCoutLeft').innerHTML 	= MEIGOKU_COUNT - meigokuCount - 1;
document.getElementById('meigokuYearsLeft').innerHTML 	= MEIGOKU_YEARS - meigokuYears;
document.getElementById('percent').innerHTML 			= (meigokuCount * MEIGOKU_YEARS + meigokuYears ) * 100.0 / MEIGOKU_YEARS / MEIGOKU_COUNT;
```

-togro16.png
![togro16.png](https://qiita-image-store.s3.amazonaws.com/0/42223/c0b930de-ae07-2349-fdbf-4671633d5c56.png)

-togro19.png
![togro19.png](https://qiita-image-store.s3.amazonaws.com/0/42223/e078319b-d72a-cab4-121d-9f66a286a49e.png)

-togro48.png
![togro48.png](https://qiita-image-store.s3.amazonaws.com/0/42223/ec0e754c-c4d2-d855-cf38-00f178a56693.png)

-togro128.png
![togro128.png](https://qiita-image-store.s3.amazonaws.com/0/42223/fbb6eee8-4fe9-b65b-76fb-538311276696.png)
Ada言語ユーザー必見! IDEの「GNAT Community 2018」紹介! 導入から"Hello World"まで。

#はじめに
Ada用の統合開発環境である、「GNAT Community 2018」を紹介します。
開発環境のOSはWindows用に説明します。

#ダウンロード
 - [「GNAT Community 2018」](https://www.adacore.com/download)
 - [「Adacore Homepage」](https://www.adacore.com/)

#インストール
私の場合、ダウンロードしたものが`gnat-community-2018-20180611-x86_64-windows-bin`でした。
Windowsの場合はこれを実行して、あとは手順通り進めればインストールが完了します。

#プロジェクト作成
デスクトップにショートカットを作成した場合、下のようなアイコンが出ると思います。
![スクリーンショット (17).png](https://qiita-image-store.s3.amazonaws.com/0/246294/ecd56187-3870-c601-269d-9256e819e8d9.png)
これを実行すると、
![スクリーンショット (18).png](https://qiita-image-store.s3.amazonaws.com/0/246294/80646b21-baec-cb8a-eb56-c2d7db9024d2.png)
となるので`Create new project`を選択します。
![スクリーンショット (19).png](https://qiita-image-store.s3.amazonaws.com/0/246294/237d221a-f775-cf64-bdb5-be7fec46060c.png)
`Basic`の`Simple Ada Project`を選択して、
![スクリーンショット (20).png](https://qiita-image-store.s3.amazonaws.com/0/246294/e4b5505e-5371-c0d8-a6b5-883ecabac61a.png)
ワークスペースの場所、プロジェクト名、メインファイル名を決めて`Apply`
#ソース編集と実行
![スクリーンショット (21).png](https://qiita-image-store.s3.amazonaws.com/0/246294/7e104a0a-e815-4f65-61bd-3856e7e14e9a.png)
あとはソースを編集します。
![スクリーンショット (22).png](https://qiita-image-store.s3.amazonaws.com/0/246294/07241021-8c72-134b-6ced-d9cf54ddcb92.png)
文字サイズはここで大きくできます。
![スクリーンショット (23).png](https://qiita-image-store.s3.amazonaws.com/0/246294/2685c42a-ecb2-4872-b824-c16ea9857907.png)
ソース編集して
![スクリーンショット (24).png](https://qiita-image-store.s3.amazonaws.com/0/246294/86bbe406-c28b-3a6c-0c2c-feb84de92d1b.png)
ビルドして実行!
![スクリーンショット (25).png](https://qiita-image-store.s3.amazonaws.com/0/246294/8b5ba492-38de-3823-2b18-e2c6f879c3ea.png)
`Hello World`でてますね。

#最後に
センター試験まで残り25日です!

#日記一覧へ
[Ada言語を習得する日記一覧](https://qiita.com/C_Assembly/items/50a0f9d8542679d92ea8)
vue.jsでクリックのデフォルトイベントを止めるディレクティブを作る

`event.preventDefault()`でデフォルトイベントを無効化できますが、これを全タグの`@click`に定義していくのはとても大変です。
そこでクリック時に`event.preventDefault()`を実行するディレクティブを作ったのでその解説です。

## そもそもそんなの必要？
基本的には使わないです。だいぶレアケースだと思います。

Stores.jpというECサービスの開発をやっているのですが、そこでは**ストアのWeb画面を作るエディタ画面**があります。
この画面では、**実際のストア画面ではリンクになりますよ**というのを示しつつ、**押しても反応しないリンク**を作る必要があります。
※押して反応してしまうと、エディタ画面から移動してしまうため。

そのため、例えば`<a>`のUIはそのままで、デフォルトイベントであるURLを移動するという処理だけ無効化したいのです。

### 膨大にあるリンク（このキャプチャには表示されていない部分でもたくさんあります）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/9023095c-973d-d125-9937-8f8a352343ea.png)



## デモ
実際のデモから見たほうがわかりやすいかと思います。
https://nuxt-sandbox.netlify.com/directives-sample/prevent-click

`v-prevent-click` というディレクティブを指定して、aタグの挙動を変えています。
また汎用性を考慮して、動的に切り替えても問題がないようにしています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/35595/0f5a9154-059e-5347-4327-9c7af8c97b15.png" width="600px">


## つくりかた
デモ画面と同じものを作っていきます。

### ディレクティブ 本体
[bindフック関数](https://jp.vuejs.org/v2/guide/custom-directive.html#%E3%83%95%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0) で要素のセットアップ処理を行います。
指定した＝イベントを止めたい、なのでデフォルトはtrueで良いでしょう。

[updateフック関数](https://jp.vuejs.org/v2/guide/custom-directive.html#%E3%83%95%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0)で値の変更を検知してイベントリスナーの追加、削除を行っています。

```js:/plugins/directives/prevent-click.js
function preventDefaultFunc(event) {
  event.preventDefault()
}

export default {
  bind(el, { value = true }) {
    if (value) {
      el.addEventListener('click', preventDefaultFunc)
    }
  },
  update(el, { value, oldValue }) {
    if (value !== oldValue) {
      if (value) {
        el.addEventListener('click', preventDefaultFunc)
      } else {
        el.removeEventListener('click', preventDefaultFunc)
      }
    }
  }
}
```

### ディレクティブのロード
Nuxt.js を使っているので、plugins配下に作りました。

```js:/plugins/directives.js
import Vue from 'vue'
import PreventClick from '~/plugins/directives/prevent-click'

Vue.directive('prevent-click', PreventClick)
```

### コンポーネント
次の3パターンを用意して動作を確認しています。

* `v-prevent-click` を指定していない場合
* `v-prevent-click` を指定した場合
* `v-prevent-click` へ渡す値を動的に切り替えた場合

```vue:prevent-click.vue
<template>
  <section>
    <h2>直接指定した場合の確認</h2>
    <ul class="links">
      <li>
        <a
          href="https://example.com"
          target="_blank">https://example.com</a> (no v-prevent-click)
      </li>
      <li>
        <a
          v-prevent-click
          href="https://example.com"
          target="_blank">https://example.com</a> (v-prevent-click)
      </li>
    </ul>

    <h2>有効無効の切り替えの確認</h2>
    <button
      type="button"
      @click="preventClickEnabled = !preventClickEnabled">切替</button>
    <ul class="links">
      <li>
        <a
          v-prevent-click="preventClickEnabled"
          href="https://example.com"
          target="_blank">https://example.com</a> (v-prevent-click={{ preventClickEnabled }})
      </li>
    </ul>
  </section>
</template>

<script>
export default {
  data: function() {
    return {
      preventClickEnabled: false
    }
  }
}
</script>

<style>
.links li {
  margin-bottom: 15px;
}
</style>
```

## あとがき
全コードを公開しているので置いときます
https://github.com/howdy39/nuxt-sandbox
DjangoのPermissionError: [Errno 13] Permission denied: '/var/www'に対応

初投稿になります。よろしくお願いいたします。

Djangoで開発をしている際に出たPermissionErrorにどのように対応したか紹介します。

##環境
macOS X

Pythonのバージョンは以下の通りです。

```
$ python -V
Python 3.6.4 :: Anaconda, Inc.
$ python
>>> import django
>>> django.get_version()
'2.1.4'
```

##エラー内容
collectstaticコマンドを打った際に以下のエラーが出て困っていました。

```
(PROJECT_NAME) $ python manage.py collectstatic
PermissionError: [Errno 13] Permission denied: '/var/www'
```

##エラー対応
STATIC_ROOTとMEDIA_ROOTはそれぞれ以下のように設定しています。

```python:settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
STATIC_ROOT = '/var/www/{}/static'.format(PROJECT_NAME)

MEDIA_URL = '/media/'
MEDIA_ROOT = '/var/www/{}/media'.format(PROJECT_NAME)
```

以下のコマンドで/var/wwwを確認したところ、wwwディレクトリは存在しませんでした。

```
$ cd /var; ls |grep www;
```

自分でディレクトリを作成する必要があります。

```
$ cd /var
var $ mkdir www
```

これは、Permission denied。

```
mkdir: www: Permission denied
```

次のようにします。パスワードを聞かれるので入力します。

```
var $ sudo mkdir www
Password:
```

同じようにディレクトリを作成しましょう。

```
var $ cd www
www $ sudo mkdir (PROJECT_NAME)
www $ cd (PROJECT_NAME)
(PROJECT_NAME) $ sudo mkdir static
(PROJECT_NAME) $ sudo mkdir media
```

そして、再度collectstaticコマンドを打ってみる。

```
(PROJECT_NAME) $ python manage.py collectstatic
.
.
.
PermissionError: [Errno 13] Permission denied: '/var/www/(PROJECT_NAME)/static/css'
```

sudoをつけて挑戦。

```
(PROJECT_NAME) $ sudo python manage.py collectstatic
Password:
XXX static files copied to '/var/www/(PROJECT_NAME)/static'.
```

成功！

以上。参考にしていただける方がいたら幸いです。
【Rails】FormObjectを使ってほしい

RailsでForm Objectを導入はするのは今となっては珍しくもないかと思います。
それでも組織やチームに文化がない状態で投入してしまうと
それ自体が負債となる場合もあるんだろうなと感じたところもありました。

今回は普及のためにもForm Objectを作る方法を紹介してみようと思います


# Form Objectとは？
単体のモデルに依存しない場合や
フォーム専用の特別な処理をモデルに書きたくない場合に用いたりします。

例えば1つのフォーム送信で複数のモデルの更新をしたい場合
バリデーションの責務が曖昧なものとなり関心事が多くなり
忘れたときに改めて解読するのも嫌になってしまうことがあります。
そのためにも責務を明確にするのは個人的には大切かなと。

責務ばかりを気にしていたら速度が失われてしまうため
状況を見つつ使い分けはしたいところ。。


# メリットはあるか？
どんなに便利な手法だとしても
用法用量を守って触らないとろくな事にならないのはお察し。。
気を取り直してどういうメリットが有るかですが

* ActiveRecordと同じバリデーションを使うことができる
* Form Objectにパラメーターをそのまま渡すことができるためエラーメッセージを戻す処理が書きやすい
* 責務がモデルとは言い切れないビジネスロジックをcontroller/viewから切り離せる
    * いわゆる単一責務の状態となりやすい

##ユースケース

* ユーザからの問い合わせを受け付けるフォームを実装したい
* 未登録ユーザは氏名とメールアドレス、内容の取得と通知を目的とする

最初はこれでよかったのかもしれない。
ただ実際にふたを開けてみたら
登録済みのユーザはIDと内容だけがいいとか
そもそも入力項目を増やしたいだとか経験がありますよね。

##Form

まずは今回の用件以外の関心ごとを減らすためにも
Form Objectの定義します

```ruby:app/forms/contact_form.rb

class ContactForm
  include ActiveModel::Model

  attr_accessor :first_name, :last_name, :email, :body

  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :email, presence: true
  validates :body, presence: true

  def save
    return false if invalid?
    # 保存, 通知, ロギング等
    true
  end
end

```

## Controller

次にControllerの処理です。
Form Objectにロジックを寄せたおかげで
scaffoldで作られようなシンプルな形を維持できます。

```ruby:app/controllers/contact_controller.rb
class ContactController < ApplicationController

  def index
    # お問い合わせ一覧
  end

  def new
    @contact = ContactForm.new
  end

  def create
    @contact = ContactForm.new(set_params)
    if @contact.save
      redirect_to :contacts, notice: 'お問い合わせを受け付けました。'
    else
      render :new
    end
  end

  private

  def set_params
    params.require(:contact).permit(:first_name, :last_name, :email, :body)
  end
end
```

## Routes

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :contacts, only: [:index, :new, :create]
end
```




# まとめ

Form Objectは一つの選択肢ですが
導入もしやすくわかりやすいのはいいところではないかと思います。
現実はこんなにシンプルには行きませんが手段として知っているだけでも選択肢が増えるかと思います。


複数人で開発を行う場合は
レイヤーの立場を明確にするなど
認識を合わせてからの導入が良いのだろうという反省のお話でした。
SECCON 2018 オンライン予選 Writeup[Runme]



このブログは、[大国魂（ITブログ） Advent Calendar 2018](https://adventar.org/calendars/3489) の24日目です。

# この記事の内容について
インフラ運用者ではあるもののセキュリティに興味があるので SECCON 2018 オンライン予選 に参加した筆者が、良質な Writeup がたくさんあるにもかかわらず自身の振り返りも兼ねて解けた問題の Writeup を書いた、というものになります。

予選終了後、便利に参照させていただいていた記事は[こちら](https://qiita.com/nicklegr/items/51cbc4ff59d245646988)になります。

今回はかなりの迷子状態に陥った reversing の Runme について振り返ります。

# Runme

## 問題文
Run me.
動かせばわかるという問題のようです。

## runme.exe

- 実行すると Failed というタイトルで `The environment is not correct.` というメッセージボックスがポップします

# 解法
## 解き方

IDA などのツールで開くと、大量のサブルーチンを順番に実行していることがわかります。
このうち定数を push している部分があり、この定数 が ASCII コードなのでつなぎ合わせるとフラグ `SECCON{Runn1n6_P47h}` を得られます。

## たどり着くまでの経緯

- runme の名前に踊らされてとにかく迷走していた
  - 各サブルーチンの jnz を書き換えて強制的に最後まで動作するよう調整したり
    (`You know the flag!` というメッセージボックスから、この中のどこかに隠されているとは思っていたものの気づかず)
  - それでも「動かした結果」フラグらしいものは得られなかったので本体自体に何かする必要があるかを考えたり
- 数時間悩んだものの皆さんどんどん正解していっているので方向性が全然違うんだろうなぁと思い、CentOS6 で strings してみたら・・・

```
[root]# strings runme.exe 
j@h' @
h0 @
BRjC
BRj:
BRj\
BRjT
BRje
BRjm
BRjp
(snip)
BRjS
BRjE
BRjC
BRjC
BRjO
BRjN
BRj{
BRjR
BRju
BRjn
BRjn
BRj1
BRjn
BRj6
BRj_
BRjP
BRj4
BRj7
BRjh
BRj}^
Failed
The environment is not correct.
Congratz
You know the flag!
kernel32.dll
user32.dll
ExitProcess
GetCommandLineA
MessageBoxA
```

でました(かなしい)
まっとうな解き方としては先ほど記載したとおり、`各サブルーチンで定数を push している部分` の定数を ASCII コードに変換するというものになります。
以下のキャプチャの `push 43h` の部分がサブルーチンごとに異なります。
適切な場所にファイルを配置して実行したり、jnz の部分を jze に少しずつ書き換えて実行可能なようにするとタイトル Congratz で中身が `You know the flag!` というメッセージボックスを確認できます。

![runme.png](https://qiita-image-store.s3.amazonaws.com/0/327348/cbc38741-89fa-76b8-6cc4-292de5be6d35.png)


ここの変換については powershell なり python なりお好きなもので対応したり、大した量がないので[一覧表](https://ja.wikipedia.org/wiki/ASCII#ASCII%E5%8D%B0%E5%AD%97%E5%8F%AF%E8%83%BD%E6%96%87%E5%AD%97)で手変換したりとご自由に進められます。

```
43 3A 5C 54 65 6D 70 5C 53 45 43 43 4F 4E 32 30 31 38 4F 6E 6C 69 6E 65 2E 65 78 65 22 20 
 C  :  \  T  e  m  p  \  S  E  C  C  O  N  2  0  1  8  O  n  l  i  n  e  .  e  x  e  "   
53 45 43 43 4F 4E 7B 52 75 6E 6E 31 6E 36 5F 50 34 37 68 7D
 S  E  C  C  O  N  {  R  u  n  n  1  n  6  _  P  4  7  h  }
```

# 問題について

binary 問題の基本の「き」のような問題でした。
まっとうに取り組まなくても strings でフラグまで確認できてしまいますし、正しい推測ができればすんなりと解けるかなと。
私は「Runme」というタイトルからの思い込みですんなりいかなかったので、思考が外れていた場合リセットする期間を(一つの作業に夢中にならず)より短くする必要があるなと感じました。
また ASCII コードへの変換部分についても、こういった細かい部分をシュッっと実装できるスキルがないとより上位の問題に取り組む余裕すらないなと感じており、日々の研鑽を忘れずにいたいところです。
FreeBSD 探検隊

## FreeBSD の普段あまり見ないディレクトリを見学する
FreeBSD のディレクトリ内を見ていくと、「こんなファイルがあったのか」とか「このファイル何？」なファイルが結構色々あります。
歴史的事情とかFreeBSDプロジェクト用とか色々な事情で入っているのだと思いますが、個人的に気になったものをいくつか紹介します。
どのファイルも amd64/i386だろうとarm だろうと、どのアーキテクチャでも入っているファイルです。

## デーモン君画像

```shell-session
/usr/share/examples/BSD_daemon/
```

以下にベクター形式で描かれたデーモン君画像が、元のXfig 版(beastie.fig)、変換したeps 版(beastie.eps)で置いてあります。このディレクトリに行けばいつでもデーモン君に会えるということですね。

eps版
![Screenshot_2018-12-24_19-14-52.png](https://qiita-image-store.s3.amazonaws.com/0/103137/80c1e10d-a2ef-31ee-c5fe-06fc37864051.png)


同じディレクトリにある FreeBSD のフォント(FreeBSD.pfa)と組み合わせて、シンプルなA4サイズのEPS形式のポスターを作るスクリプトposter.shもあります。

```shell-session
$ sh poster.sh > /tmp/poster.eps
```
ポスター
![poster.png](https://qiita-image-store.s3.amazonaws.com/0/103137/ddcc8971-6bb4-b0b3-efcc-77d24443c805.png)

### コミッター相関図

```shell-session
/usr/share/misc/organization.dot
/usr/share/misc/committers-src.dot
/usr/share/misc/committers-doc.dot
/usr/share/misc/committers-ports.dot
```
に、FreeBSD プロジェクトの組織図と src/doc/portsコミッターの相関図があります。dotファイルはテキストファイルで、graphviz (graphics/graphviz)のdotコマンドで png 形式に変換することができます。

PNG変換するコマンドは

```shell-session
$ dot -T png -o committers-src.png /usr/share/misc/committers-src.dot
```

そして変換して出てきた図

src コミッター相関図(committer.dot -> committer.png)
![committers-src.png](https://qiita-image-store.s3.amazonaws.com/0/103137/a1ecdd84-4dd4-ffc3-44b1-13fb2a77a2fb.png)

なるほどわからん。横に長すぎてかなり見づらいような。
元の dot ファイル(「A -> B」という記述で相関関係を表現している)を見たほうがわかりやすいかも。

![committers-src-dot.png](https://qiita-image-store.s3.amazonaws.com/0/103137/98822ed1-0646-3145-e587-1525f0a23d78.png)

### ASCII 表

```shell-session
/usr/share/misc/ascii
```
にASCII表が 8進、16進、10進で書かれています。

![ascii.png](https://qiita-image-store.s3.amazonaws.com/0/103137/e522fb2c-3f59-c07f-4749-c16402b9fd42.png)

割と必要になるケースが多いASCII表、テキストだから、Xが無くても見られて便利ですね。

## UNIX/BSD系統図
```shell-session
/usr/share/misc/bsd-family-tree
```
にUNIXの「First Edition (V1)」から各BSD(FreeBSD/NetBSD/OpenBSD/Dragonfly/macOS)の現代に至るまでの系統図がテキストアート形式で書かれています。

![bsdtree.png](https://qiita-image-store.s3.amazonaws.com/0/103137/b001bfdd-fd09-f084-3c30-48bb12067554.png)

見ると内容はかなり細かく、MacOS Xへの影響が FreeBSD4.4→Mac OS X 10.2 と FreeBSD 5.1→ Mac OS X 10.3 であった事がわかったりします。
この詳細をテキストアートで表現してるのがすごい。

## 花言葉？
```shell-session
/usr/share/misc/flowers
/usr/share/misc/birthtoken
```
に花言葉が書かれたファイルと、各月の誕生石/誕生花が書かれたファイルがあります。

* 花言葉ファイル
![flower.png](https://qiita-image-store.s3.amazonaws.com/0/103137/0a3888bf-4805-9901-9636-49ddabbb1852.png)

* 誕生石/誕生花ファイル
![birthtoken.png](https://qiita-image-store.s3.amazonaws.com/0/103137/fcba56f3-b26f-7708-f232-3f288a38d061.png)

BSD ユーザーはいつでも花言葉を諳んじることが求められるということでしょうか。

svn の log を見るとどちらも少なくとも 4.4 BSD Liteまで遡れるファイルだということがわかります。

![birthtoken-svnlog.png](https://qiita-image-store.s3.amazonaws.com/0/103137/3988309e-9e3f-74cd-a092-20706a765246.png)

flowers は 2012 にスペルミスが修正されてます。
ちゃんとメンテされてる。

![flowers-svnlog2.png](https://qiita-image-store.s3.amazonaws.com/0/103137/bfb56a06-6bab-4787-7448-b7efb5cb6413.png)
メモ：「３０日でできる！OS自作入門 」17日目

## コンソール

1) アイドルタスク
- io_hlt しかしないタスクを作成
- 今までのカウンターのタスクを一旦無効
- これで体感速度はもとの速さに

2) コンソールを作ろう
- 一応黒い画面

![スクリーンショット 2018-12-24 20.32.18.png](https://qiita-image-store.s3.amazonaws.com/0/109145/70cc56e1-bd27-5ccf-2f44-2b8bcb19867a.png)

3) 入力切り替えをやってみる
- タブキーでウィンドウの切り替え（文字はまだ）

4) 文字入力もできるようにする
- 対象のFIFOにデータを送るだけ
- 今まではfifoはローカル変数だったので、TASKの構造体に fifoを入れる
- これでどっちも文字入力できるようになった

![スクリーンショット 2018-12-24 20.41.47.png](https://qiita-image-store.s3.amazonaws.com/0/109145/94c93001-cbf0-6e0b-bdd5-5cbc83f4b6bb.png)

5) 記号入力
- シフトキーのON/OFFによって表示する文字を切り替え

![スクリーンショット 2018-12-24 20.58.26.png](https://qiita-image-store.s3.amazonaws.com/0/109145/f1450cbe-f4d7-667d-d68a-f4d5700f82c2.png)

5) 大文字と小文字
- Capslock の状態を BIOSから持ってきてるので、それを使う

![スクリーンショット 2018-12-24 21.04.07.png](https://qiita-image-store.s3.amazonaws.com/0/109145/c1af4ad2-924c-1f8c-99a1-4f3de167e694.png)

6) Lockキー対応
- キー入力から CapsLock などのLEDを反映
- うまく動作しているようです。
ツイート投稿の旅（MVC）



###①tweet投稿！
#### 　▶︎ビュー
　　L  httpメソッド：post
 　　L  パス(URL)：/tweets/

<br>
###②サーバー通過！
　　L　post '/tweets' 

<br>
###③ルーティングでルート選択
　　L　tweets（コントローラーの）#create（postだったらこのアクション）へLet's Go！

<br>
###④コントローラーで保存先を決定
Tweet（モデルへ）.create（[保存]アクションをするよ）

```
  def create
    Tweet.create(tweet_params)
  end

  private
  def tweet_params
    params.permit(:text)
  end
```

<br>
###⑤コントローラーで保存先&内容決定
####　⑤-1　ストロングパラメーター
   　　　　▷保存内容を厳選！　　　　▷セキュリティ強化！

```
tweet_params
```
どんな内容になってるのか、覗いてみよう！

####   ⑤-2　　params

```
params.permit(:text)
```
##### 　　▶︎params：いくつもの情報※が入っている（＝大きなハッシュ[キー：バリュー]）
　　　▷キー：name属性 (**view**>tweets>new.html.erb)　
　　　▷バリュー：入力された情報 （form_tagで指定したパスより）

#####　　▶︎binding.pry　　　※いくつもの情報を確認する方法
　　　L（1） :  ` def create `（止めたいアクション）の下に記載
 　　　L（2） : web site上で、確認したいアクションを実行（投稿ボタンを押す など）
　　　L（3）：ターミナルに【キー：バリュー】のハッシュスタイルで情報が出力される
　<br>
見えたところで、今回保存したいのは【text】だ！

#####　　▶︎permit：許可する
　　`(:text)` これでテキストだけ保存されるように、指定完了！

<br>
###⑥モデル通過
数あるモデルの中からTweetモデルを通りまして、
<br>
###⑦データベースに保存
やっと保存出来たぞ！わーい！わーい！
<br>
###⑧ビューへ反映
 来た順路を帰ります。
　データベース（⑦）→モデル（⑥）→コントローラー（⑤,④）
→（ルーティングは設定が書いてある場所だから、帰りはスキップ！）
→サーバー（②）→ビュー（①）


<br>
`投稿` の旅、お疲れ様でした！
複数の時差処理を扱いたいとき

Unityでの時差処理と言えばコルーチンですが、
なんとも書き方が直感的でないので、
いまいちピンと来ねぇぜー！って思っておりました。

一か所ならコピペでなんとなくその場をしのぐのですが、
複数になると、Time.DeltaTimeに逃げたくなります。(それで書けるなら良いんですが)

そんなとき素敵な書き方に出会いました。
```
 StartCoroutine(DelayMethod(3.5f, () =>
    {
        Debug.Log("Delay call");
    }));


private IEnumerator DelayMethod(float waitTime, Action action)
{
    yield return new WaitForSeconds(waitTime);
    action();
}

```

今後お世話になりそう。
DraftSight Tips

<img width="368" alt="draftsight.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/30474/6238a0db-2c48-a31a-3256-6c020531baa3.jpeg">


自分用のメモとして。
主に寸法関連のよくハマるやつを[^1]。

[^1]: 寸法いじりだすとうまくいかないことが多いけど、AutoCADでも昔よくハマってたし、フリーでここまでできれば言うこととないです。そういえば、[IntelliCAD](https://ja.wikipedia.org/wiki/IntelliCAD) はもうやめたんかな。昔買ったのに。

# 寸法数値の四捨五入

1. 寸法線を選択
2. プロパティの`Primary UnitSystem` > `+/-` の値を変更（デフォルト:0）

例：0.5mm 刻みにしたいの場合は`0.5`とする。

# Rや穴の寸法数値の前にある "R" や "φ" を消したい

1. まず Command Window で変数を変更する

```
dimpost
<>
```

2. 次に、寸法（直径 or 半径）を入れる。（寸法数値のみが記入されるはず）

3. 寸法が記入できたら、

```
dimpost
. （←ドット）
```

として元に戻しておくこと。

# 直径寸法の寸法数値に「4-3.2キリ」とか入れたい

即値で直接上書きしてもいいけど、それやると寸法線を動かしても値が更新されないので、以下のように。

1. 前項のTIPSで、まず"φ"を消しておく。
2. 直径寸法を記入する。
3. プロパティの`Primary UnitSystem` > `0.00の打ち消し線の下にabcと描いてあるアイコン` の値に `4-<>キリ`と入力

`<>`は寸法数値を表す。

# 部分拡大図の寸法値倍率変更

以下、ビューポートを使わずに個別に寸法数値の縮尺を変更する姑息な方法

1. 寸法線を選択
2. プロパティの`Primary UnitSystem` > `xn` の値を変更（デフォルト:1）

例：拡大図 2:1 （2倍）の場合は`0.5`とする。`1/2`と入力してもよい。

ただ、この方法で個別に変更すると修正漏れを招く恐れ大なので、やはりビューポートを使ったほうがよいと思われ。

# 斜め寸法などの寸法数値の配置を寸法線の上/下に反転・移動

AutoCADと同じ方法は使えないっぽいので、以下に手動で寸法数値を動かす方法を

1. 寸法線を選択
2. プロパティの`Text` > `A回転マークっぽいやつ` の値を好みの角度に変更。
このままだと寸法数値が寸法線の上下中央に配置されてしまう
3. プロパティの`Fit` > `keep dimline with text` を `Move text, no leader` に変更
4. これで寸法数値が自由に動かせるようになるので、寸法線の上にうまいこと調整して配置する

# Auto save ファイル

ときどき不意に落ちるので、オートセーブのファイルを復元するとよいです。

## ファイルの場所（Mac版）

デフォルトの状態では、オートセーブファイルは `
/Users/ユーザ名/Documents/DraftSight_ユーザ名_autosave/元のファイル名_XXX_X.ds$`という名前になっているようです。中身は元の .dwg 形式です。

## 復元

```
cd /Users/ユーザ名/Documents/DraftSight_ユーザ名_autosave/
cp  hoge_123_4.ds$ ~/Downloads/hoge.dwg
open ~/Downloads/hoge.dwg
```

などとして、DraftSight で開けばよいです。


# 確認バージョン

- DraftSight 2018 SP2.1 (BETA) Mac版


# 参照
- [DraftSight for Windows 使い方](https://www.cadlt.net/draftsightshiifa.html)
- [DraftSight for Mac 使い方](https://www.cadlt.net/DraftSight-Mac/index.html)
CakePHP3 のIDE Helper のご紹介

これは [CakePHP Advent Calendar 2018](https://qiita.com/advent-calendar/2018/cakephp) の22日目の記事です。
他人の土俵で相撲を取る記事で恐縮ですが、空いてたので許してください。

さて、僕は、CakePHP3のアプリケーションを書く際に、PhpStormを使っています。
namespace とかいちいち書かなくていいし、deprecated のコードとかも見つけやすいし最高だと思っています。

ただ、めんどくさいこともあります。
それは、静的解析がうまく動いてくれない場合があることです。  

文字で説明するよりコードを見ていただいたほうが早いと思うので、例を上げます。
ここでは、例として新しいコンポーネントを作る際のことを考えます。

```php
<?php

namespace App\Controller\Component;

use Cake\Controller\Component;

class ReadRequestComponent extends Component
{
    public function isGet()
    {
        return $this->request->is('get');
    }
}

```

まあ、こんなメソッド / コンポーネントを作る人は実際はいないとは思いますが、あくまで例です。
こんなコンポーネントが作られたということは、どこかしらコントローラーから呼び出されることになるでしょう。

今回は、これまた例として、UsersController::index() から呼ばれたときのことを考えてみましょう。
繰り返しになりますが、こんなコンポーネントいらないですからね！本当は！

```php
<?php
namespace App\Controller;

use App\Controller\AppController;

/**
 * Users Controller
 *
 * @property \App\Model\Table\UsersTable $Users
 *
 * @method \App\Model\Entity\User[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
 */
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('ReadRequest');
    }
    /**
     * Index method
     *
     * @return \Cake\Http\Response|void
     */
    public function index()
    {
        $users = $this->paginate($this->Users);
        $g = $this->ReadRequest->isGet();
        $this->set(compact('users', 'g'));
    }
?>

```

このとき、UsersController には大きな問題が生じているわけです。
そう。 `ReadRequest`って何？ という。
残念ながら、PhpStorm は、 ReadRequest というコンポーネントの存在を知りません。
なので、`isGet()` なんてメソッドないけど？ と怒られてしまいます。

これはまあ当然といえば当然ですし、融通がきかないといえばそれまでです。
が、現実はそうなっています。

では、このねじれ現象を解消する方法はないのでしょうか？

いえ、あります。
それは、PHPDoc を書いてあげること。
クラスの説明のところに以下を追記してあげます。

```
/**
 * @property \App\Controller\Component\ReadRequestComponent $ReadRequest
*/
```
すると、あらビックリ！
PhpStormが、そのメソッドの存在を認識してくれました。
めでたしめでたし。

なのですが、これを全ファイルに対して毎度行うのがめんどくさい。
というのが今回のテーマです。

ということで、前振りが長くなってしまいましたが、今回ご紹介するのがこちら(注1)。
https://github.com/dereuromark/cakephp-ide-helper
CakePHP コアメンバーの、 [@dereuromark](https://twitter.com/dereuromark) さんが作成されています。  

使い方はいたってシンプルです。
[Composer 経由でインストールし、いくつかの設定を追加](https://github.com/dereuromark/cakephp-ide-helper/tree/master/docs#install)したあと、

```sh
bin/cake annotations all # 注2
```

というコマンドを叩けば終わりです。  

何ということでしょう！今までノーガード戦法だったコードにアノテーションがついて、
静的解析できるようになっているではありませんか。
git commit の prehook とかに仕込んでおけば、もうPhpStormに怒られることもありません。

ということで、めっちゃ便利なプラグインのご紹介でした。

一応、念の為、全然必要ないとは思いますが、どんな感じで動くのかイメージを掴んでもらうために、
[レポジトリ](https://github.com/gorogoroyasu/cakephp-ide-helper-demo/pull/2/files)を作りました。
僕の文章力が足りず、イメージが湧きづらかったらご活用ください。
では皆さん、メリークリスマス！

注1. `"cakephp/cakephp": "^3.6"`
注2. all の部分は、 model とか template とかいろいろオプションがあるのですが、詳細はReadme を読んでみてください。 --help でもいろいろ出てきます。便利です。
AWS Amplify ConsoleとAWS CodeBuildでサーバレスアプリをデプロイするまでどれくらいでできるかタイムトライアルしてみた

本記事は[AWS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aws)の24日目の記事になります。

# やりたいこと
AWS re:Invent 2018で「AWS Amplify Console」なるものが発表された時、どの程度お手軽にデプロイが可能なのか、試したことがあります。

[AWS Amplify Consoleがどれだけお手軽か試してみた所感](https://qiita.com/kojiisd/items/709557fa4649aa25b483)

が、これはいわゆる「静的ページをデプロイ」してみたにすぎません。実際にはサーバレスアプリケーションみたいなものをデプロイしてみたいものです。（本記事にはAmplify Consoleは出てきません）上記前記事参照。

というわけで、上記を機能追加したアプリケーションをクライアント側とサーバ側に分けてデプロイしてみようと思います。ただし、本当にお手軽に行けるか、タイムトライアルで。

開始：17:30

ちなみに後述のCodeBuildは今回初利用です。

# 構成
1. クライアントは前回と変わらず。Angular 6をベースとしたアプリケーション。いわゆる以前のAWS Amplify（JavaScript SDK）を利用しています。
2. サーバ側はAPI Gateway + Lambdaといういわゆる一般的なサーバレスアプリ

# 何ができるアプリか？

こんな感じにCognitoのユーザ追加や承認処理を画面から行うための手抜きアプリです。（強制承認をしたい時にいちいちCLIからコマンド打つの面倒だよね、というモチベを元に、グループ変更とかまでしようとしている（開発中）アプリです）

![スクリーンショット 2018-12-24 16.41.04_png.png](https://qiita-image-store.s3.amazonaws.com/0/102769/056e0b5c-db34-66b3-83ce-622d436c4077.png)


- クライアント側
https://github.com/kojiisd/aws-amplify-user-management/tree/0.1

- サーバ側
https://github.com/kojiisd/lambda-cognito-user-manager/tree/0.1

【注意】
一応Cognito認証は通していますが、CORSは全OKにしているし、セキュリティ周りはガバガバなので、ご利用は計画的に。

# デプロイ準備
クライアント側は以前実施しているのでスキップします。今回はサーバ側のデプロイをCodeBuildで管理してみます。これができれば、CodePipelineでトータルのビルド管理ができるようになるので、クライアント側と同様、GitHubへのコミットをトリガとしてテストやビルドを自動で通すことができるようになります。

ちなみに、当然サーバ側ビルド前に公開されているクライアントにアクセスしても、APIコールで失敗します。

![スクリーンショット 2018-12-24 18.58.43.png](https://qiita-image-store.s3.amazonaws.com/0/102769/8847cc08-c3a4-3712-0935-e18542988ebc.png)


## サーバ側のデプロイ設定
特別な設定はしていませんが、OS:UbuntuでNode8系の環境を選択しました。buildspec.ymlも当然新規に作成（その場でエディット）です。

※最初Python環境を選択して1時間ほどハマりましたが、ビルド環境がPythonである必要は全くないことに気づき、Node環境に途中から切り替えました。

![スクリーンショット 2018-12-24 20.21.24.png](https://qiita-image-store.s3.amazonaws.com/0/102769/d4882658-f86a-b8fd-1a96-b34f6c75fd1b.png)
※Python環境で頑張っていた時の図。serverlessのインストールのためのnpm実行でハマりまくりました。

serverless.ymlの中に指定するUserPoolIdやCognitoのARNは、CodeBuildの環境変数を利用してビルド途中で置換しました。

![スクリーンショット 2018-12-24 20.09.37_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/a5e59ee2-aa57-f75f-5bf9-3eb7fc9ff5f2.png)


これでなんとかビルドまで通りました。API Gatewayなどが無事出来上がりです。とっても楽チン。

```yml
version: 0.2

phases:
  install:
    commands:
      - apt-get update -y
      - npm install -g serverless
  pre_build:
    commands:
        - sed -i -e "s|COGNITO_IDP_ARN|${COGNITO_IDP_ARN}|g" serverless.yml
        - sed -i -e "s/USER_POOL_ID/${USER_POOL_ID}/g" serverless.yml
  build:
    commands:
      - sls deploy
```

![スクリーンショット 2018-12-24 20.28.55_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/81257dfd-a07c-2df2-9269-f8a2dc95f65f.png)


画面操作できるようになりました。

![スクリーンショット 2018-12-24 20.31.54_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/2a66ece3-5980-c739-6992-590bfca82a94.png)


終了時刻：20:30


## まとめ
3時間程度で（はまった時間があるとはいえ）サーバレス側のビルドとクライアント側への繋ぎこみなどが完了しました。もう少し効率化できたかもしれませんが、ぱっとの思いつきと勘でここまでできてしまうという点は、AWSのおそるべきところかと思います。


[前回の記事](https://qiita.com/kojiisd/items/709557fa4649aa25b483)と合わせて、これでクライアント側の高速なデプロイ＆公開と、バックエンドのビルド自動化（トリガ設定すれば）が可能になりました。以前書いた記事のAWS Amplify Consoleも2時間程度で設定できてしまったので、トータル1日以内でクライアントとサーバのデプロイ、および公開ができてしまう時代なのは嬉しいですね。
git commitするたび人類滅亡

この記事は[全部俺 Advent Calendar 2018](https://adventar.org/calendars/3702)の24日目の記事です。
~~クリスマスイブなので~~なんでもないただの休日ですが人類を滅亡させます。

# ある日のこと
あー仕事したなー(；・∀・)
さくっと`git commit`して家でゆっくりするぞー

※音が出るので注意してください

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">armagedon per commit <a href="https://t.co/3GGh4Ac6qS">pic.twitter.com/3GGh4Ac6qS</a></p>&mdash; tez (@te22eret) <a href="https://twitter.com/te22eret/status/1077164860109074432?ref_src=twsrc%5Etfw">2018年12月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



(　ﾟдﾟ) ・
(　ﾟдﾟ) ・・
(　ﾟдﾟ) ・・・

( ﾟдﾟ ) 

## 仕組み
`.git/hooks/pre-commit`を使用して、`git commit`実行時にコマンドをフックしています。

[コミットするたび人類滅亡](https://gist.github.com/taishi-h/36e22678de9ee54275c2825408970b1a)を、`.git/hooks/pre-commit`に作成して`git commit`するだけでいつでもどこでもアルマゲドンです！
Mac環境とWindows + Git Bash環境にて動作を確認しています。

## pre-commitの本当の活用法について
pre-commitをネタで使用しましたが、本来pre-commitは生産性やコード品質を高めてくれるイケてるツールです！
手前味噌ですが、以下の記事のように使用することで、ダサいソースコードをコミットして恥ずかしい思いをすることを防いでくれます。

- [pythonでimport順序が守られていないソースコードをコミットできないようにする](https://qiita.com/tez/items/5c9a42b075d75d4a5aac#%E3%81%8A%E3%81%BE%E3%81%91%E3%82%BD%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
- [Goでgolintにてイケてないコードが検出されたらコミットできないようにする](https://qiita.com/tez/items/417c72a275fd1399645e#pre-commit%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%82%A4%E3%82%B1%E3%81%A6%E3%81%AA%E3%81%84%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%82%92%E9%98%BB%E6%AD%A2%E3%81%99%E3%82%8B)

pre-commitは用法用量を守って正しく使用しましょう。

## 参考
偉大なる先人に感謝します:pray:
[DevTools を開いたら人類滅亡](https://qiita.com/diescake/items/b25791eb7750c775e72f)
メモ：「３０日でできる！OS自作入門 」16日目

## マルチタスク-2

1) タスク管理の自動化
- タスク２つだけじゃなくてもっと出来るように　（１０００まで一旦固定）, GDTの初期化などを task_init 関数に処理させる
- レジスタの初期化も task_alloc に移動
- 他にも今実行中のタスクを管理する taskctl などを task_run から設定するようにする
- task_switch で次のタスクを実行するように変更

2) スリープしてみる
- HLTなどしている間、別のタスクに処理させたい
- カウンターの速度は結構早くなった感じ

3) ウィンドウを増やそう
- カウンターのウィンドウを３つにしているが、体感的にはすごく遅くなった。
 
![スクリーンショット 2018-12-24 20.05.49.png](https://qiita-image-store.s3.amazonaws.com/0/109145/368bdad9-6966-b376-8825-0206c162e317.png)

4) 優先順位をつけよう
- task_b0, b1, b2 の間で優先順い。おそすぎて反応あまりない

5) 優先順いをつけよう２
- main のタスクの優先順位を上げる
- レベルという概念を導入
    - うん、これでも遅い
    - まぁ、無限ループカウンター３つのせいだが。。。
ABテスト,カナリアリリース,ブルー・グリーンデプロイの違い

けっこう曖昧なので調べてみました。

# ABテスト
* サイト・アプリを改善する際に、どっちのやり方がいいか両方本番にデプロイして調べる方法です
* アクセスしたユーザーに対してランダムに表示する機能を切り替え、コンバージョン等の結果を測定します
  * 試したい複数の機能に加え、「ユーザーを振り分ける機能」、「振り分けたユーザーから結果を測定する機能」が必要になります
* 改善案が間違っていた場合、一部の本番のユーザーが離脱するなどの悪影響にもなりかねます
  * 振り分けをしているので全ユーザーにはなりませんが、意識する必要があります 

* [参考](http://www.project-unknown.jp/entry/firebase-abtest)
 
# カナリアリリース
* 新機能リリース等の際に一気にリリースするのではなく、一部ユーザーに振り分けて様子見しながら徐々に新機能に移行する方法です
* ABテストとの違いは、別に機能を試して調査したいのではなく、リリースに関わるトラブルのリスク軽減が目的であることです
  * 負荷等の問題が発覚したらロールバックする。振り分けしているので全ユーザーには影響しないで済むこともある
  * 「ユーザーを振り分ける機能」が必要です

# ブルー・グリーンデプロイ
* リリースの際に、稼働中の本番と同じ構成のシステムを構築し、そちらにリリースします
* リリースが完了した際に、本番の向き先をリリース済み環境に切り替えます
* これは、リリースに関わるトラブルのリスク軽減が目的です
  * 停止時間
  * リリース作業の複雑さ等
  * [参考](http://www.atmarkit.co.jp/ait/articles/1612/13/news005.html)
* 本番と同等規模の環境と、アクセス先切り替え機能（ロードバランサ等）が必要です
* 特にデータベースをどう扱うかはかなり難しいと思います
  * [参考](https://www.slideshare.net/setoazusa/jjug-ccc-bluegreendeployment)
今すぐalias登録すべきワンライナー

記事のタイトルは[アドベントカレンダー](https://qiita.com/advent-calendar/2018/yumemi01_one-liner)のタイトルをそのまま使わせてもらいました
僕が `alias`登録して使っている中で最も使用頻度が高かったものをご紹介します。  

## git push

`Git`　はもはやデファクトと言っていいくらい普及しているバージョン管理ツールですね。
`hub` コマンド等 `Git` の関連ツールのコマンドもとても便利ですね。
そんな `Git` なのですがリポジトリに `push` する際に `git push` の代わりに使っている `alias` を紹介します。


```shell
alias gcb="git rev-parse --abbrev-ref HEAD" # current branch
alias gp="gcb | xargs git push origin"
alias gpf="gcb | xargs git push origin --force-with-lease"
```

例えば `GitHub` でリポジトリを `Fork` しているような人だと初回の　`git push` は下記のようにエラーが出ると思います。

```shell
$ git push                                                             
fatal: The current branch test/branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin your-branch-name
```

上のコマンドを実行するか、省略形で `git push -u origin your-branch-name` とすれば解決するのですが、初回の `push` のたびにブランチ名を入力するのは面倒です。紹介した `alias` を使えばいつのタイミングでも　`gp` と打つだけでリモートリポジトリに変更点を `push` できます。これでブランチ名の入力の手間が省けましたね。やったね


## cd
これはちょっとした `tips` なのですが、よく使うので紹介します。  
紹介する `alias` は下のようなものです。

```shell
alias 0="cd /Users/username/development/my-oss"
alias 1="cd /Users/username/development/product"
alias 2="cd /Users/username/blog/"
```

さて、これはセクションのタイトルにある通り `cd` コマンドを実行する `alias` となっています。  
自分の都合にもなってしまうのですが、業務での開発・趣味での開発。また、複数言語・複数プラットフォーム と同じローカルの環境で行き来することがとても多いです。 ディレクトリを移動したい時にいちいちディレクトリを入力するのはとても手間です。この `alias` を登録しておけば **0** と入力して Enter を押すだけで `cd /Users/username/development/my-oss` に移動します。そして、この数字は普段コマンドの最初として入力することがないものなので心なしか `typo` も少なくていいです。もちろん `cd` 以外のコマンドを登録しておくのもありでしょう。実は僕も **0** は前述した `gp` コマンドを割り当ててます。しかし、手軽にやれてしまうので破壊的なコマンドの登録はやめておきましょう。オススメしません。

## 終わりに
いかがでしたでしょうか。
`awk` コマンド等を使った多少凝ったものも便利なのですが、今回は簡易なものを組み合わせたちょっとしたシェルコマンドの `alias` をご紹介させていただきまいた。

みなさん素敵なワンライナーおよびシェルライフを送りましょう

おしまい \\(^o^)/
MDNの翻訳がしたい

翻訳活動に参加するには、やっぱり、英語力があった方がよいと思いながらも、
日々のすることにかまけて、英語の勉強にまで手が回らなかった一年だったなぁと少し後悔。

毎度のことながら、来年こそは、英語の勉強をしたいと思っております。

でも、何からはじめようかなと・・・

やっぱり、NHKの英語講座かなぁ。

2020年のボランティアにも応募したし、英語はできるようになりたいと思うこの頃です。
Seeed製品はどこから買うべきか？？

みなさん、Seeed製品はどこから買っていますか？
通販だとスイッチサイエンスや秋月電子通商、チップワンストップなど、リアル店舗だとマルツや千石電商、シリコンハウスなどをご利用いただいているかと思います。

リアル店舗の秋葉原エリアの様子については、asagiさんが記事を書いてくださっていました。（Seeed UG Advent Calendar 2018の3日目）

[秋葉原エリアでSeeed製品を買えるお店をご紹介！](http://asagin.hatenablog.com/entry/2018/12/03/000126)

今回は、Seeed製品を**国内販売店**から買う場合と、**Bazaar**から買う場合の違いを考えてみたいと思います。

# Bazaarって何？

Seeedが運営している、通信販売サイトのことを**Bazaar**と呼んでいます。
具体的には**www.seeedstudio.com**。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/217e749b-7777-4e94-3d0e-e7d7db8a4573.png)

URLが**www.seeedstudio.com**なので、Seeed本社＝通信販売と思ってしまいますが、、、
Seeed本社のサイトは別でして、**www.seeed.cc**なんです。
Seeed本社のサイトを見ると、Online StoreやPrototype Servicesといったものがあり、このOnline Storeが通信販売サイトBazaarにあたります。

Bazaarは中国で運営していますが、日本から利用することも可能です。
一般的な通信販売と同様に、ユーザー登録して商品をポチって、クレジットカードの番号を入れれば、DHLやFedExといった国際便で商品が手元に届きます。いやー、ほんと便利な世の中になりましたね。

ちょっと余談ですが、このBazaarのWebサイト、12月にリニューアルしたようで、見た目が変わりました。
リニューアル直後、製品ページから詳細情報（Wiki）へのリンクが見つからず、ちょっと戸惑い．．．。
製品ページの**LEARN**タブをクリックしたところにリンクがありますのでご安心を。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/9ea44820-4bdf-f599-618d-586ab86c5621.png)

ここからは、わたしがBazaarから購入したときに良かったこと、悪かったことを紹介したいと思います。
あ、ちなみにBazaarの社内事情詳しくないので、完全に利用者目線ですｗ
（Bazaarチームや販売店から刺されないかドキドキ）

# Bazaarから購入すると、、、

## ◎ 商品が豊富

当たり前のことではありますが、Seeed製品の取扱商品が豊富です。
新商品も取り扱っています。（当たり前や！）

## ◎ 数量割引

たくさん買うと安くなります。
このように、各製品ページに何個以上買ったらいくらになるか表示があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/16cf1f0c-1b87-71bd-a3a4-29f14b6284d5.png)

ただ、これちょっと難しくて、数量増えると

## × 日本の法律に適さない商品

日本で使ってはいけない商品が届いてしまう危険性があります。
PSEとか、、、TELECとか、、、。

## × 手元に届くのが遅い

海外から送ってくるので、届くのに時間がかかります。

これが結構読めなくて、、、
物流が混んでいたりするとプラス数日、
通関で引っかかるとプラス数日、
日曜日に引っかかるとプラス数日。（←たいていの国際便業者は日曜日は非稼働です）

さらに、中国の春節・国慶節と重なって、プラス１週間なんてこともあります。

以前に、国慶節に重ならないよう早めに手配したにもかかわらず、物流混雑で遅延して国慶節に重なってプラス２週間なんてことがありました（涙

## × パッケージ破損

海外から送ってくるので、パッケージが破損しているときがあります。

## × サポートが英語

日本にSeeed株式会社がありますが、この日本法人は海外から直接購入しているものは原則サポートしていません。
商品が届かないとか、故障していた、、、といったトラブルは、Bazaarチームと英語メールでやりとりしなければいけません。

## 消費税等＋手数料

日本に輸入する際に消費税等が課税されることがあります。（場合によっては課税されません。）
消費税等の支払いが発生したときは、さらに国際便業者の代行手数料が発生します。

# 国内販売店から購入すると、、、

## ◎ 手元に届くのが早い

リアル店舗に行けば、即ゲットできます。
通信販売の場合でも、たいていの国内販売店は国内に在庫を持っていますので、数日で手元に届きます。

## ◎ 安心サポート

商品に初期不良があったときでも、日本語で対応してもらえます。
これはウレシイ。

## × 商品が無い

販売店が仕入れていないと、、、無いです。

# 雑記

Bazaarの商品でも、日本へ発送できないものがあります。MT3620 DevKit US Versionとか。
一方、国内でしか買えないものもチラホラ見かけます。Wio 3G, Wio LTE M1/NB1(BG96),Seeeduino Storage for Flashair。

一長一短ですが、、、
通常は、国内販売店から購入したほうがいいでしょう。