OmniAICreator/Qiita-1.07M huggingface dataset:
基板作成用のＶカッターの再研磨

#目的
　Arduinoの基板は完成したが、そこには志半ばに倒れたＶカッターの残骸の山が残った。
　切削開始直後に折れたものも多々あり、これは(勿体ない)可哀そうだ。
　そうだ先端を再研磨して、もう一度使えるように新たな命を吹き込もう。
　※なぜ折れたのかは、前回の内容におおよそ書かれた通り。
　※大した値段じゃないのだから、ケチケチしないで捨てればといわれそうですが。
  
#経緯
　前回の施策によりかなり安定して切削可能となり、Ｖカッターの消耗は激減した。
　しかし、それまでにダメにしたＶカッターが多数出来てしまった。
　また、購入したＶカッターも先端形状がそろっている保証もなく、切削に不安がある。
　そこで、使用するＶカッターの先端の確認を行い、必要とする切削幅に合致しない場合、
　再研磨を行い、基板切削の安定を図る。
　※Ｖカッターは焼き入れされていると思われるが、これを再研磨して再焼き入れは未実施。
　　実質工具の寿命が短くなっているとは思われるが、現在の所は著しい消耗は見つかっていない。
　　下記は所詮しろうとのお遊び。効果は自分で確かめてね。

#使用工具
　(1)ダイヤモンド砥石
　(2)デジタルマイクロスコープ
　(3)ルーペ用目盛板　※Amazonで購入したJT-27 (J&T-F6)を使用、但し今は0.1mmは売っていない。
![Image10.jpg](https://qiita-image-store.s3.amazonaws.com/0/159764/bd072701-c207-9847-460d-65a5fac5b75b.jpeg)

#１．正常な先端の確認
　購入したＶカッターは下記のような形状をしていた。
　これが一般的なのか、このメーカー特有なのかは未確認。
　(1)刃の形状は、円錐を半分に切ったような形をしている。
　(2)写真のでは判り難いが、半円の一部がカットされている。(逃げ角か?)
　(3)先端は平らにカットされている。多少水平ではないが、これも何か理由が有るかも。
　(4)背面は45度程度にカットされている。
　　※これがないとカッター食い込みが悪く、下降時にトンと基板を叩く音がして着地点がずれる。
![Image7.jpg](https://qiita-image-store.s3.amazonaws.com/0/159764/8bf4ee93-c158-1523-31bf-81543b94cb78.jpeg)

#２．折れた先端の確認
　折れたＶカッターの先端を写真で示す。
　切削中に割れて、0.5mm程度短くなった。
![Image8.jpg](https://qiita-image-store.s3.amazonaws.com/0/159764/bbb09f62-9498-2f1f-bdd3-2ba3ce6c8119.jpeg)

#３．再研磨作業
　手作業で先端を再研磨して、もう一度使えるようにする。
　作業の途中途中には、マイクロスコープで研磨結果を確認しながら行う。
　(1)Ｖカッターを垂直に保持し、砥石(#1000)上で数回往復して先端を水平に研磨。
　　※削りすぎに注意、結構よく削れる。
　(2)Ｖカッターを斜め45度に保持し、背面を研磨。
　(3)スケールに当てて、プリント基板での切削幅(刃の太さ)を確認する。
　(4)切削幅が所要の幅を超えている場合、幅を調整(研磨)する。
　　・ＶカッターをCNCに取り付ける。
　　・モーターを低速で回転させる。
　　・Ｖカッターに砥石を当てて周囲を削る。
　　※削るのには多少の時間を要するので、大きく折れたものは再研摩不可となる。
　　※回転部に注意し、巻き込まれ等で怪我をしないように。
![Image9.jpg](https://qiita-image-store.s3.amazonaws.com/0/159764/3d0b8c5c-8ac8-68d5-dfe1-674b7f469051.jpeg)

#４．再研磨の効果確認
　再研磨したＶカッターでプリント基板を切削し、効果を確認する。
　刃面の平滑度が悪くなるので、切れ味も悪くなる。
　切削例で示すようにバリがたくさん出るので、表面にヤスリをかけて綺麗に洗い流す。
　金属片が残っていると、はんだ付け時に回路をショートさせ泣きを見る確率が高くなります。
![Image11.jpg](https://qiita-image-store.s3.amazonaws.com/0/159764/24c45723-54f0-9116-31c9-bfacc074950e.jpeg)

#　
　上記記載内容は無保証であり、各自の責任においてご利用願います。
　不都合な結果になっても、当方は責任を取れません。あしからず。
ウィキペディアタウンの定量効果を分析してみた

# はじめに

今年も全国でウィキペディアタウンが盛んに開催され、各地域の史跡や文化財などの記事が増え続けている。大山街道を舞台に開催しているウィキペディア街道「大山道」もこれまで19回開催して、地元の名所・旧跡を対象に計46本の新規記事を作成してきた。

【参考1】 [プロジェクト:アウトリーチ‎ | ウィキペディアタウン](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88:%E3%82%A2%E3%82%A6%E3%83%88%E3%83%AA%E3%83%BC%E3%83%81/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2%E3%82%BF%E3%82%A6%E3%83%B3)
【参考2】 [ウィキペディア街道プロジェクト](https://wikipedia-kaido.github.io/)

１９回開催してきた中で、ふと、ここまでの取り組みを定量的に振り返ってみたくなった。そこでウィキペディアタウンに関して誰もが疑問に思うであろう、以下３点について、実績（数値）ベースで可視化してみた。

**Q1:継続して参加者は集まるのか？**
**Q2:ウィキペディアタウンで執筆の腕は磨けるのか？**
**Q3:作成した地域記事は閲覧されているのか？**

# Wikimedia Toolforge

今回の分析（Q2,Q3）では、[Wikimedia Toolforge](https://tools.wmflabs.org/)を活用した。
Wikimedia Toolforgeのツールに、[ページビュー分析](https://tools.wmflabs.org/pageviews/?project=en.wikipedia.org&platform=all-access&agent=user&range=latest-20&pages=Cat|Dog) があり、各記事の日別・月別のページビュー数やサイズなどを調べることができる。表示したページビュー数は、CVSやJSON形式のファイルでダウンロードすることも可能である。

# Q1:継続して参加者は集まるのか？ 

ウィキペディアタウンに限った話ではないが、イベント開催は単発では盛り上がるものの、その後、回を重ねていくと減少するのが一般的である。では実際のところはどうなのか？

ウィキペディア街道の全19回の参加登録データを基に、参加者数推移をグラフ化してみた。開催場所や季節によって変動はあるが、基本的には開催回数が増えるにつれて緩やかに減少傾向にある。
![ウィキペディア街道「大山道」参加者数の推移](https://qiita-image-store.s3.amazonaws.com/0/104146/195de2a0-4074-a3f0-54f1-3fdf5a4a010b.png)
ただし内訳で見ると10回以上（過半数）の参加者が6名で、うち５名は本イベントがきっかけとなっている。よって、開催回数をこなすことは、発信者（執筆者）とその仲間を増やすきっかけとなる、とは言えるのではないか。

# Q２：ウィキペディアタウンで執筆の腕は磨けるのか？

記事のクオリティは本来は内容で測るべきもので定量化が難しい。ただし脱初心者にフォーカスを当てるならば、記事のボリュームサイズをみることで、ある程度判断ができるのではないか？と考えた。

そこで、ウィキペディア街道の全19回の作成記事の平均サイズ推移をグラフ化してみた（ウィキペディアンの方が集中執筆した一部の記事は平均から除いた）。

初心者中心の開催である最初の数回は、平均で5,000バイト程度の記事が多かったが、回数を重ねるにつれて10,000バイト前後の記事が多くなっている。初心者がウィキペディアタウンに繰り返し参加することは、一定レベルまで執筆の腕を磨くことに繋がると言える。
![作成記事のサイズ](https://qiita-image-store.s3.amazonaws.com/0/104146/f36b6ed8-f848-f2d4-b6c2-d96279cb0ce8.png)
なお参考までに、平均から除いたウィキペディアンの方が集中執筆した記事のサイズは20,000バイト台であった。一定レベルまで執筆の腕を磨いたらその後は、個人での鍛錬次第、ということかもしれない。

# Q3:作成した地域記事は閲覧されているのか？

ウィキペディアタウンで作成された地域記事は、実際に参照されて活用されているのだろうか？そこで「Google検索のヒット順位」、「主な記事のページビュー数」の２つの観点を確認してみた。

## Google検索のヒット順位
「ウィキペディア」のメディア力によるところが大きいが、Google検索でのヒット率は高く、約75%の記事がトップ（1位）で表示される結果となった。
![Google検索でのヒット順位](https://qiita-image-store.s3.amazonaws.com/0/104146/a87d64d1-ad6d-a3ae-cab5-a6efda9b6025.png)

## 主な記事のページビュー数
ウィキペディア街道では、地域に密着した多くの神社記事を執筆した。主な神社記事の月別ページビュー数をグラフ化して見ると、年末年始と、七五三の季節である10月を中心に、ページビュー数が伸びており、地域に密着した行事の際に参照されていることがわかる。
![ページビュー数.png](https://qiita-image-store.s3.amazonaws.com/0/104146/8b1db14f-b327-a13d-1667-eff9e7283798.png)

なおウィキペディア街道の執筆記事で最もページビュー数が多いのは、知名度が高い「世田谷代官屋敷」となった。毎年度１２月と1月に開催されるボロ市の時期を中心に、高いページビュー数を記録している。
![代官屋敷.png](https://qiita-image-store.s3.amazonaws.com/0/104146/82028eca-ec29-4b1f-1b4f-07cbcf40b888.png)

# 終わりに
今回はひとまず初歩的な定量分析をやってみたが、実績データを蓄積して可視化することで、色々な考察結果が見えてきた。今後も引き続き実績データに基づき可視化と分析を進めたい。

以上
Kagglerに聞いたDeepLearning入門法メモ

社内の飲み会でKaggler[^1]達に聞いたことのメモです。
私はまだDeepLearning入門できてないので誤認識あるかもしれないです。
あと、私は「機械学習とは何をすることか」ぐらいの知識はあり、
それ前提で話してもらってたかも知れません

# 細かいことは動かしてから勉強すればいい
Kaggler「今どの辺やってんの？」
ワイ「誤差伝搬法の勉強中です。計算追うの面倒ですねあれ」
Kaggler「そういうのどうせフレームワークで隠蔽されるから別にやんなくてもAI開発はできるよ」
Kaggler「使ってから『裏側はこうなってんのかー』って知る感じでいいよ」

# 実はDeepLearningは簡単
* (本当に？と思いつつ聞く)
* 数学の理論とかそんなにがんばんなくていい
* 他の機械学習手法は数学難しいのもある
* 「こんなん誰でも出来る」とまで言ってました(´ﾟдﾟ｀)

# 精度向上に効くのはデータとその扱い方
* これはよく聞くやつですね
* 理論とか手法を頑張るより圧倒的だそうです

# おすすめフレームワークはPyTorch
* 「`Tensorflow`と`PyTorch`」は「`C++`と`C#`」ぐらい違う
    * 基本的に `PyTorch`のほうが記述が簡単
* `Keras`経由で`Tensorflow`を使ってもいいけど、別に`PyTorch`でよくね？となる
* 日本に閉じて構わないなら`Chainer`もいいけど、別に`PyTorch`でよくね？となる
* `TPU`使うとかのケースぐらいしか`Tensorflow`の方がいいケースはない  
(このあたりでTensorflow eager mode信者が乱入して宗教戦争が起きるが私にはついていけず。)

# Kaggleやってみなよ
* 他の人の書いたモデルを読んだりして勉強できる
* 最下位層は「AIの判定結果出力のcsvを0埋めで提出する」 レベルらしく、初心者でもがんばれば全然やっていけるとのこと


次回から真偽のほどを確かめつつDeepLearning入門記事を書いていきたいです

[^1]: AIの精度を競うDeepLearningの大会Kaggleに参加する人のことです。上位の人はGoldの称号が貰えるらしく、最近社内のチームがGoldとったので話しました
[ページ遷移しないWebシステム] TypeScriptによるWindow Framework

# 1．事始め
　現在、PHPで作っている[システム](https://croud.jp)をNode.jsに移植しようと、バックエンドのフレームワークを開発している。そこでTypeScriptを使い始めたら思いのほか便利だったのでフロントエンドでも使うことにした。

　以前からJavaScriptのウインドウフレームワーク自体は開発を行っていた。しかしターゲット環境をIE11(GoogleBotが理解できるレベル)と定めていたため、classの使用すら許されずかなり不便な思いをしていた。ところがTypeScriptさえ使えば、そのあたりの問題が全て解決することに今更ながらに気がついた。もう少し早く使っておけば良かったと思う。

# 2．どんなことが出来るフレームワークなのか

　[https://github.com/JavaScript-WindowFramework/JSW](https://github.com/JavaScript-WindowFramework/JSW)

##　サンプル実行結果

　フレームウインドウを二つ表示
　フレームウインドウの中は、左右を分割するスプリッタとツリービューを表示
　ツリービューのアイテムをクリックすると、ボタンが生成されドラッグドロップで移動できる

![Desktop 2018.12.21 - 08.36.07.01_2.gif](https://qiita-image-store.s3.amazonaws.com/0/267629/cead15c4-1d6e-1aae-9736-dd2f9a9bdfc8.gif)


##　ソースコード


```index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8"/>
	<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"/>
	<link rel="stylesheet" href="css/JSWindow.css"/>
	<script type="text/javascript" src="js/JSWindow.js"></script>
	<script type="text/javascript" src="js/JSWTreeView.js"></script>
	<script type="text/javascript" src="js/JSWButton.js"></script>
	<script type="text/javascript" src="js/Main.js"></script>
	<title>JSWindowTest</title>
</head>
<body>
</body>
</html>
```

```Main.ts
//フレームウインドウを継承し、機能を追加する
class CustomWindow extends JSW.JFrameWindow{
	constructor(){
		super()
		this.setTitle("カスタムウインドウ")	//タイトル設定
		this.setSize(400, 300)			//サイズ設定

		//分割ウインドウの作成
		var splitter = new JSW.JSplitter(200)
		this.addChild(splitter, 'client')	//クライアント領域全体に設定

		//ツリービューの作成
		var treeView = new JSW.JTreeView()
		treeView.addItem('あいうえお')		//アイテムの追加
		treeView.addItem('かきくけこ')
		treeView.addItem('さしすせそ')
		splitter.addChild(0, treeView, 'client') //分割ウインドウ左へ

		//ツリービューが選択された場合の処理
		treeView.addEventListener('select', function (e) {
			//選択アイテム
			var item: JSW.JTreeItem = e.params.item
			//ボタンを作成
			var button = new JSW.JButton(item.getItemText())
			button.setMoveable(true)	//ボタンを可動式に
			splitter.addChild(1, button)	//分割右へ
		})

	}
}

addEventListener("DOMContentLoaded", Main)
//ページ読み込み後に実行される内容
function Main() {
	//ウインドウの作成
	var win = new CustomWindow()
	win.setPos(32, 64)
	//ウインドウの作成、二枚目
	var win2 = new CustomWindow()
	win2.setPos(100,200)
}

```

　フレームワークの利用者が書くのはトップのHTMLファイルでjsを読み込む処理と、ウインドウを使用する処理の部分となる




# 2．開発の前提条件

##　出力コードに関するもの

　・開発はTypeScriptだが、生成したものはプレーンなJavaScriptでも利用できるようにする
　・出力はES5で行い、IE11やGoogleBotが理解可能にする
　・他から一切のライブラリを持ってこない
　・import文は使わず、WebPackなども使用しない

##　フレームワークに関するもの
　・一般的なウインドウシステムと同じく、複数ウインドウの重ね合わせや親子関係のサポート
　・使い方はWindowsForms風で、子ウインドウを指定箇所にドッキングさせる
　・ウインドウを継承することによって、様々な機能を拡張可能にする
　・ウインドウを継承することによって、ドラッグ操作によるリサイズや移動をフルサポート
　・WindowsFormsのようなレイアウトエディタによる画面設計(これは予定)

# 3．現時点で作ったもの
　・ウインドウのベースクラス
　・フレームウインドウによるリサイズ、移動、最小化、最大化、クローズ
　・ウインドウの分割バー(縦横対応)
　・ツリービュー
　・ボタン

# 4．今後作るもの
　・Windowsライクなヘッダリサイズ対応のリストビュー
　・AndroidのLinnerLayoutなんかのレイアウトコンテナっぽいやつ
　・リッチテキストエディタ
　・レイアウトエディタ

　リストビューやリッチテキストエディタは旧フレームワークで実装済みのため、それを移植する予定
　レイアウトエディタはいつになるか分からないけれど、編集後の出力結果はJson形式&JavaScriptの変数に代入するようなフォーマットにする予定
AA表示用の軽量なフォント(43KB)を作った

どうも@scrpgilです。
[AAHub](https://aahub.org)というまとめzipビューワーや[AA箱](https://b.aahub.org)を作っているAAエンジニアです。

さて私は基本Webサービスを作ることが多いんですが、そこで問題になるのが**AA対応の日本語フォントファイルが重い**という問題です。

この記事では私がFontForgeを使って日本語フォントファイルの容量を削減した時の内容を書きます。

## 日本語フォントファイルのサイズ感
さて、以前使っていた日本語フォントファイルのサイズは以下の通り。

AAHub Fonts
ttf: 2.6MB
woff: 1.6MB
woff2: 1.3MB
https://fonts.aahub.org/font/1

woff2の状態でも1.3MBあります。そして厄介なことにAAという性質上、このフォントを読み込むまでまともに動作しません。

一様他にも軽いフォントはあるものの、それでも400KBほどになります。

Saitamaar
ttf: 2.6MB
woff: 590.9KB
woff2: 398.1KB
https://fonts.aahub.org/font/6

私は、当時Lighthouseの点数アップになみなみならぬ情熱を注いでいたので極限までフォントファイルを軽くすることにしました。そして作ったのが以下の「aahub_light」フォントです。

aahub_light
ttf: 94.9KB
woff: 57.9KB
woff2: 43.9KB
https://fonts.aahub.org/font/2

なんとwoff2の状態で43.9KBしかありません。しかしそれでいてAAの表示は問題なく行えます。


## 何をしたか？？
漢字グリフを全て削除しました。漢字は等幅なのでAAを表示するだけなら必要ないといった感じです。
例えば、以下の漢字は全部同じ幅です。
　亻人艹丁十
　間凧越蟹願

というわけでFontForgeを使って漢字グリフを全て削除しました。それだけで、1.3MBあったフォントファイルが43.6KBまで小さくなりました。

## まとめ
フォントファイルが小さくなったことでサイトの表示が圧倒的に高速化されました。なかなかフォントファイルをいじる機会はなかったのでこのような体験ができてよかったです。

昨今はIoTやウェアラブルデバイスなどハードの要件が厳しい環境も出てきているので、こういったフォントファイルの変更はもしもの時の手段の一つとして覚えておいて損はなさそうです。
それでは。
kubed-shを使ってローカルにRuby,Python,Nodeをインストールせずにスクリプトを実行する

# kubed-shとは

https://github.com/mhausenblas/kubed-sh

ちょっとしたRuby,Python,Nodeのコードを実行したい。けどローカルにRuby,Python,Nodeがインストールされていない。
ってこと時々ありますよね。
[repl.it](https://repl.it)を使う選択肢もありますが、ローカルサーバーや社内サーバーと通信するプログラムの場合そうはいきません。
そういう場合、kubed-shを使うと便利です。
kubed-shはKubernetesクラスタにRuby,Python,Nodeがインストールされたpodを用意してそこでプログラムを実行してくれます。

# インストールして試す

試したkubed-shのバージョンは0.5.1です。

まずminikubeとかでKubernetesクラスタをkubectlを使える状態にしておきます。

https://github.com/mhausenblas/kubed-sh#install-it にあるとおりにインストールする。

```
$ curl -s -L https://github.com/mhausenblas/kubed-sh/releases/download/0.5.1/kubed-sh-macos -o kubed-sh
$ chmod +x kubed-sh
$ sudo mv kubed-sh /usr/local/bin
```

次にテスト用のスクリプトを用意します。

```test.rb
#!/usr/bin/env ruby
require 'socket'
hostname = Socket.gethostname

puts "Hello from Ruby, running on host #{hostname}"
```

次に`kubed-sh`コマンドを実行します。

```
$ ./kubed-sh
Note: It seems you're running kubed-sh in a non-Linux environment (detected: darwin),
so make sure the binaries you launch are Linux binaries in ELF format.

Detected Kubernetes client in version v1.8.6 and server in version v1.10.0


Type 'help' to learn about available built-in commands.
[minikube::default]$ 
```

これでkubed-shが提供するシェル環境に入った状態になりました。
ここで先程のスクリプトを実行してみます。 

```
# スクリプトがあることを確認できる
[minikube::default]$ ls -l
total 8
-rw-r--r--  1 akira  staff  120 12 22 14:41 test.rb

# スクリプトを実行
[minikube::default]$ ruby fuga.rb
pod "kubed-sh-1545457321216549000" created
uploaded /Users/akira/ws/sandbox/kubed-sh/fuga.rb to kubed-sh-1545457321216549000

Hello from Ruby, running on host kubed-sh-1545457321216549000
```

実行できましたね。メッセージからスクリプトをする際にpodが作成されているのがわかると思います。
また、先程のスクリプトファイルをローカルマシン側で内容を変更して再度実行すると、変更内容が反映されます。
ローカルサーバーと通信したい場合はローカルマシンのIPを指定すれば通信ができます。

なかなかおもしろいですね。
Linuxのかな漢字変換の興亡

タイトルは「Linuxの「かな漢字変換」」です。ひらがなの文字列を普通の漢字かな混じり文にするソフトウェアの話です。

# はじめに

この記事ではLinuxの日本語入力を歴史の中で特にかな漢字変換の部分の歴史についての概要です。その時代に広く使われていたと筆者が独断で思う物のみに触れます(触れてない物の中には筆者の友人知人の作品も含まれていて心苦しい点もありますが…)。

# Linux以前 - 国産ワークステーションの時代
80年代後半から90年代前半にかけて国内の複数の会社がワークステーションを製造販売していました。各社ではそれぞれのアーキテクチャにUnix系OSを移植し、何社かはそこに搭載する日本語入力のシステムを自社で開発し、さらに素晴らしい事にほぼオープンソースな条件でソースコードを公開していました(NECのCanna, オムロンのWnn, SONYのSj3)。
その中ではCannaやWnnといったソフトウェアがLinuxで使われるようになっていきました。
しかしながら、国産ワークステーションの市場が縮小したため、ソースコードを公開しての開発は90年代中盤に終了してしまいました。
その後も有志によって細々と開発は続けられましたが、ほとんどが処理系の変化への追随やパラメーターの更新といった内容で、変換アルゴリズムを改善して精度を向上させるような努力は行われませんでした。かな漢字のコア部分のような複雑なコードは本業としての深いコミット無しに改善できるような楽な物ではないのが理由であると考えてます。

# Linuxデスクトップへの期待
この記事を最初に書いた2018年においてLinuxと言えばサーバーを動かすOSもしくはAndroidのカーネルといった認識が強いですが、1990年代後半にかけてLinuxの利用者や開発者が増えていった際にはPCへのデスクトップでの発展が期待されていました。
1996年にKDE、1999年にGNOMEが登場して改善が進むといった動きの中でWindowsのシェアを侵食していく可能性が真剣に議論されていました。オープンソースへの楽観的な期待が膨らみ、コミュニティの力で大企業が真剣に取り組んでいるものに対抗できると考えるのは非常に楽しいものでした(その頃、筆者は学生だったので現実のビジネスへの理解は薄かったです)。
デスクトップ環境がそのように勢いを感じさせる状況の中でも日本語入力のためのソフトウェアは前節で述べたようなワークステーション用のものが使われ続けていました。
そういう状況を解決すべき(と考えてたかは忘れましたが…拙作の)Anthyが登場し、2004年頃からいくつかのディストリビューションに標準搭載されました。
この頃はかな漢字変換だけでなく、GUIの改善や国際化といった点でも多くの成果がありました。
その後、Linuxデスクトップのブームの退潮に伴うように開発は停滞していきました。Anthyも開発は2007年頃には開発が終了しました(作者自身もコードを書く時以外はWindowsを使うようになっていったと記憶してます)。

オープンソースのもの以外にも商用のソフトウェアがいくつか発売されましたが、この市場の成長が期待外れで売り上げにならなかったせいかビジネスとしては終了しています(とある製品の売り上げを聞いたことがあるのですが、絶望的な金額でした…)。


# 少し前の状況
そんな中Google日本語入力のオープンソース版であるMozcが2010年に公開され、性能の高さもあって広く使われるようになりました。Mozc公開時のリリース文には「今回のオープンソース化は、まずは Chromium OS への対応を目的としたものですが、同時に、より多くの開発者に日本語入力やインプットメソッドに興味を持っていただくことも強く期待しています。」とあり、まずは開発者のためという意図があったようでした。
2013年にはRedHat社の技術者によってlibkkcというかな漢字変換が公開されています。Mozcがパッチを受け入れないといったことが開発の理由として挙げられていたようですが、libkkcがパッチを受け入れながら開発できているのかは不明です。(Vala言語という言語で開発されてます…ご存知？)
どちらのソフトウェアもgithub上で見る限り開発は停滞している様子です(社内用ブランチにフォーカスが移った可能性もあります)。

# まとめ
この分野のソフトウェアがコミュニティを取り巻く状況によって活発になったり停滞したりといったことが繰り返される様子をまとめてみました。近い内に何かが発生するとは思いませんが(何年も間を開けた方が周辺の技術が進歩して、色々と楽になってると考えられますし)、次はどんな変化が起きるのか楽しみです。
…ということでSKKを使いましょう(筆者もLinuxでコードを書いてコメントを日本語で書くときに使ってます)。コミュニティの力でメンテナンスできるシンプルさは素晴らしいですよね(かな漢字変換の議論をしている時に自分はSKKを使ってるとだけ主張しにくる人がいて迷惑ですが…)。

## 蛇足
昨今は機械学習等の知識の普及により、かな漢字変換への理解が深まっているのを感じます。例えば、大量のマイナーな語彙を手動で追加してみると普段使いの性能が低下するというのは一部の人が何となく認識していたことではありますが、最近では開発者を含む専門家がTweetや論文などで言及したため多くの人々が理解するようになりました。(古のネットニュースのfj辺りに書いてあったいい加減な解説を真に受けた人も見かけなくなりました)

以前、国内の業界団体による「OSS貢献者賞」という表彰が10年程行われ、その間に日本語入力や文字入力に関わっていた多くの人々が推薦を受けたのですが、誰も受賞しませんでした(年に数人から10数人、OSSの別の様々な分野の人々が受賞していました)。筆者個人としてはキーパーソンの誰かは受賞してしかるべきだったと考えていますが(日本人だったら日本語を扱う技術を大事にすべき！とか内輪の飲み会で主張してたりしますが…酔ってない時には言いません)、現実的にはそれが業界もしくはコミュニティの評価の代表例のように思えます。

この分野はオープンソースだから通りすがりの誰かが改良に参加するっていう楽観論が辛くなる領域のようです。また、ディストリビューションを通してユーザーに届けるってのは結構めんどくさかったので、そのうち改善されると良いなと思うなど…

Unixワークステーション時代のソフトウェアはサーバークライアント方式を取っていたのですが、複数ユーザーで使う時にユーザー名を名乗る仕組みはあっても、パスワード等で認証を行う仕組みを持っていませんでした。筆者の感覚的には80年代だとOK、90年代だとヤバい、今世紀の基準では許されないという感じです。歯ブラシを共有する状況に例えたりします。

2004年辺りのとあるLinux distributionのデフォルトのサーバーとクライアントの設定は次の画像のような感じでした。ウソがつけるだけでなく、正しい情報を伝える方法が無い場合があったりと、今の基準ではダメですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193078/e325f4a6-5e58-1641-a51b-edf9c720f3c6.png)
Qiitaの新規投稿ページで猫に邪魔されたらどうなった？

[猫に仕事を邪魔されてみたかったので技術で実現した - Qiita](https://qiita.com/ampersand/items/7180f657b3d0a0c05734) by @ampersand さん


# 結果は「捕獲ゲームが始まって俺キーボード操作が猫になった」


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1d286d8e-eef2-9142-bf90-af92361b0158.png)

# キーボード入力中に邪魔されるのが最高の使い方じゃない？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b4b84edd-3570-ee6a-d2a4-8f54c3a29f5d.png)

# スクリーンショットを撮るのが難しい！

もう走り去っている。これすら猫捕獲ゲーム。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
NFCとNFDに気をつける

自分のサイト(AAHub)で起きた問題の備忘録的内容です。NFCとNFDについてです。


NFCとNFDについては以下の文字列をどこかのtextareaに貼り付けてみてみてください。
NFDと書かれた方は「ギ」がキと濁点の組み合わせになっており、例えばバックスペースで削除する時は最初に濁点が削除されてキだけになると思います。

NFD:3月ウサギ
NFC:3月ウサギ

## 起きた問題
AAHubのユーザーからタイトルをコピペしてWindowsのエディタに貼り付けたら表示が崩れたと言われてしまいました。どうやらタイトルがNFDだったからのようです。
![usagi.png](https://qiita-image-store.s3.amazonaws.com/0/165335/eb19cc0e-d870-c9cc-8dd6-d35afd92dcb2.png)

## なぜ発生したか？
このタイトルはGCSに置いているファイル名を使っています。どうやらMacから直でファイルをアップロードしていたため起きたみたいです。
![Screen Shot 2018-12-22 at 14.14.57.png](https://qiita-image-store.s3.amazonaws.com/0/165335/63a45bc3-93aa-40bf-319d-d6a3ccec58bc.png)

Macだとフォルダに置かれるファイルはNFDで扱っているようでそれを例えば以下のようなスクリプトでGCSにアップするとこうなってしまうようです。

```bash
gsutil -m cp -r out/folders/* gs://example/folders/
```

## 修正
不便に感じる方がいるのは間違いないし濁点が分割してるなんてマニアックな動きをするのもエンジニア以外は面食らうと思いますので修正しました。JavaScript上だと以下の処理で変換することができます。

```javascript
str = str.normalize("NFC");
``` 


## まとめ
こ知らないと対策わからないし、言われないと気づかないところです。けど不便に感じるユーザーが確実にいると思うので対処していきたいですね。
それでは。
お前らの議論の仕方は間違ってる -フェーズを意識した議論の進め方-

# はじめに

おかたいタイトルの記事ばかりなので、たまにはアオリ系のタイトルにしてみました（笑）

それはさておき、会議やちょっとしたミーティング、ペアで作業しているときのペアとの会話など、議論するときにこんな経験はないでしょうか？

<img width="1179" alt="スクリーンショット 2018-12-22 13.17.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/94618/096eac29-212c-e94a-0b5e-0d55f660706b.png">

* 会議の残り時間がもうないのに議論が終わる気配がない。
* ある事柄を掘り下げていこうとしているのに、まだ別のアイデアが出てくる。
* 逆に、まだアイデアが出きっていないのに、結論を出そうとしている。
* そもそも何について議論しているのかよくわからない。
* もはや誰が何を話しているかすらわからない。（もうどうでもいいや...）

よくある風景ですよね！！（笑）

この記事ではこういった会議を改善するために、ファシリテーショングラフィックをご紹介したいと思います。

# ファシリテーショングラフィック

ファシリテーショングラフィックを知ったのは、このワークショップ「[ファシリテーショングラフィックで議論の見える化をしよう](https://devlove-kansai.doorkeeper.jp/events/7588)」です。（もうずいぶん前ですね）

口頭で議論していても空中戦になってしまって成果が出ない、ということで **議論を「共有」「発散」「収束」「決定」のフェーズに区切る** ことで論点が散らばらないようにします。

また、 **各フェーズの目的に適したツール（表現方法）を使います。**
箇条書きで十分なケースもあれば、何かしらの表現方法を使ったほうが良いこともあります。

# フェーズと適したツール

## 共有フェーズ

議論のオープニングです。
議論に入る前に、議論の前提を出席者で確認・共有します。

* 議論の目的を確認する。
* 議論のゴール（なにを決めるのか、なにをアウトプットするのか）を確認する。
* 出席者全員が議論に参加できるように、前提や予備知識を共有する。
  * これをやっておかないと、議論が "知っている人" だけの議論になり、"知らない人" が置いてけぼりになります。
* 配布資料・参照資料を確認する。
* 議論の進め方（グランドルール）と時間配分を決定する。
  * 時間配分は、だいたい 共有:発散:収束:決定 = 1:4:4:1 くらいな感じかなと思います。

#### ツール

議論の進め方などは、出席者全員の目につくところに簡潔に書き出しましょう。
また、議論の土台となる全体イメージがつかめるようなポンチ絵があると、スムーズに議論が進むことも多いです。

* 箇条書き
* ポンチ絵

## 発散フェーズ

目的・ゴールを達成するための意見を出し合うフェーズです。

* とにかく意見・アイデアを出す。
* 意見の深掘りはここではしない（我慢する）。
* 意見・アイデアの整理（カテゴライズや分析）をしない。  
  * 洗い出す作業と整理する作業を同時にやると、整理するほうに引きずられて意見が出なくなります。
  * いきなりマトリクスとか書き始めると、なんども書き直すはめになって時間が足りなくなります。

#### ツール

意見・アイデアを連想的に出していきたいので、ツリー状に表現するのが良いと思います。

* 箇条書き
* マインドマップ

## 収束フェーズ

「発散」で出た意見を取捨選択して、さらに詳細に掘り下げていくフェーズです。

* 意見・アイデアの中から、筋が良さそうなものを選択する。
* 選択した意見・アイデアについて、さらに深掘りしていく。
  * 有効性
  * 実現可能性
  * 実行に際しての問題点・課題
  * コスト、リソース、時間
* このフェーズでは新しい意見・アイデアは出さない。
* 出すなら場の合意を持って明確にフェーズを「発散」に戻す。

#### ツール

整理・分析していくので、観点（軸）が何次元なのかによって表現が変わってきます。

* 箇条書き
* マトリクス

## 決定フェーズ

議論のクロージングです。
「収束」した意見をまとめて出席者で確認・合意ます。

* 決めたことの確認。
* 次のアクション（誰が、いつまでに、何をするのか）の確認。

#### ツール

箇条書きで良いと思いますが、必要ならスケジュール線表みたいなものも書くと良いかもしれません。

決定事項は、議論に参加していなかった関係者が見ても意味が通じるようにまとめると良いと思います。

* 箇条書き
* スケジュール線表

# まとめ

いかがでしょうか。

特に「発散」と「収束」が混ざりがちなので、今どちらのフェーズなのかを意識するだけでもずいぶん違うと思います。

以上です。
[メモ]VimでGoのデバッグ環境を整える

自分用メモ
いつの間にvimでもGoのデバッグがデキるようになったので、その環境設定メモです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/d942d5ff-aa3e-8be8-eddd-f56dc7f318f0.png)

# 必要なもの
- vim-go
- delve

# delveインストール
https://github.com/derekparker/delve/blob/master/Documentation/installation/osx/install.md

Macユーザはこれを忘れずに。

```
xcode-select --install
```

```
go get -u github.com/derekparker/delve/cmd/dlv
```

# 使い方
1. `:GoDebugStart`でデバッグモード起動
2. `:GoDebugBreakpoint`でブレイクポイント設定
3. `:GoDebugContinue`でブライクポイントまで実行

# コマンドまとめ
| コマンド          | 説明                                                   | キーマッピング |
|:------------------|:-------------------------------------------------------|:---------------|
| GoDebugStart      | デバッグモード開始                                     | -              |
| GoDebugTest       | テストをデバッグする                                   | -              |
| GoDebugRestart    | デバッグリセット                                       | -              |
| GoDebugBreakpoint | ブレイクポイント設定                                   | F9              |
| GoDebugContinue   | ブレイクポイントまたプログラム終了するまで実行         | F5             |
| GoDebugNext       | ステップオーバー                                       | F10            |
| GoDebugStep       | 次のステップまで実行                       | F11            |
| GoDebugStepOut    | 関数を最後まで実行する                                 | -              |
| GoDebugSet        | 変数に値をセットする、floatとintとそれらの発祥の方のみ | -              |
| GoDebugPrint      | カーソル上の変数の値を出力する                                     | F6             |

# キーマッピング設定
```viml
au FileType go nmap <silent> <F12> :GoDebugStart<CR>
au FileType go nmap <silent> <F12><F12> :GoDebugStop<CR>
```
Oracleブロンズを目指して　概要編①

#Oracleブロンズ　概要編①
出題数はあまり多くないようだが基本中の基本。
##データベースの種類
そもそもデータベースとはデータの格納方法等からいくつかの種類が存在する。
###リレーショナル型データベース
以下の特徴がある
　・データを表として格納する
　・表は「行」「列」で構成されている
　・表と表を関連付けできる
リレーショナルデータベースを管理するには
「リレーショナルデータベース管理システム（RDBMS）」というソフトウェアが必要
###オブジェクトリレーショナル型データベース
　オブジェクト指向を取り入れたデータベース。
　以下の特徴がある
　　・構造を定義した「属性」、操作である「メソッド」が組み込まれている
　　　⇒データそのものとデータの処理方法をオブジェクトとしてデータベースに格納できる
　　・同一のデータベースで複数のオブジェクトをサポートする
###その他の種類
他にも以下のような種類がある
　・階層型データベース
　・ネットワーク型データベース
#基本的な用語
表　：　データを格納するもの
行　：　データそのもの
列　：　行を構成する個々のデータの切り分け単位
フィールド　：　データを入力するときの最小単位
主キー　：　表の中に格納されているデータを一意に識別するための列
外部キー　：　別の表と関連付けするときに使用する列

![図１_DBの概要.png](https://qiita-image-store.s3.amazonaws.com/0/327332/207af953-bdb4-7ae8-68f6-10edcbb17abe.png)
人類がJavaScriptに勝つ方法

[「JavaScriptに人間は勝てない」というのを実感するツール](https://qiita.com/ssaita/items/bc7b46a3f49548b498b8)における人類の反撃の記録です。

解説を読むと`Tracer`オブジェクトの`move`メソッドで移動処理をしています。こいつを無効化すればヤツらは動けなくなります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304012/24557e0a-0f41-4d6f-28c1-7f8e427beeb6.png)

consoleから上書きして無効化してやります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304012/fbd4228e-6fbe-7460-710f-31ca9195ebb3.png)



```javascript:コピペ用
Tracker.prototype.move = () => {}
```

# まとめ
人類は~~チートできる~~JavaScriptに勝てる

頭冷やすとさすがに内容薄すぎるので消すか検討中
CdataでhubspotとTableauを連携・分析したいと思ったときの注意事項（CDataは日付invalidを許さない）

##tableauにhubspot連携がデフォルト設定されていない問題##
tableau導入し、SFAツールとしてhubspotを導入したのはいいものの、
実はtableauのデフォルトデータソースにはhubspotはいないのです（これは正直すごく辛い）。
MarketoもSalesforceもデフォルトでいます…。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329826/3460a625-0744-b4ea-ccc2-6eb211404544.png)

ただSFAとしてhubspotはすごくいいツール。
（~~2018年12月22日段階、Qiitaのタグ存在せずですが~~）
その為、hubspotとtableauで分析する為にCDataを導入した話。
そしてその際に困ったこと、解決したことを共有する為に、こちらに記載します。
CDataはDesktop経由ならば一定期間無料で出来るので、ぜひお試しください。（下記リンクで詳細記載、宣伝ですｗ）
https://www.cdata.com/jp/drivers/hubspot/odbc/

導入方法などは今回はCDataのサポート担当にお任せして、hubspotと連携する際の注意事項を記載します。


###CDataはinvalid を許さない###
hubspotのデータを早速tableauで分析しようとしてみると、、、
こんなエラーが出てきます。
その他のデータベース (ODBC) データ ソース 'Deals (HubSpot.Deals) (CData)' との通信中にエラーが発生しました。無効な接続: Tableau はデータ ソースに接続できませんでした。
Error parsing date value [２０１７・０３・２０].
※値はあくまで例示です。

これは何かというと、hubspot上のDeal内で無効な値が存在している。
そして、そのデータが日付形式でtableau上で読み込まれているんだ。という状態です。

「じゃあhubspotで値を直せばいいのね！」と思われるかもしれませんが、
実はhubspot上だと本日付けで何がErrorかをざっと把握する方法はありません（nullで帰ってくる）

じゃあどうするんだ、という話です。
###解決方法###
その場合、ログ・ファイルを書き出してください。ポイントは二点。
1.txtファイルで記載すること。
2.詳細レベルは3に設定すること。（参考ファイル）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329826/14df4a10-5ab7-08d1-fb3f-b541f8b386e2.png)
上記を設定した後に、tableau上で操作をするとLogファイルに数多くのデータが記録されます。
その際に、Errorの原因なっているものを1件ずつ検索してhubspot上で修正…そういう根性論で直します。

これが本当に辛い。。。


ただその後のデータ分析の際はhubspotで出来なかったことが数多く出来るようになるため、本当にオヌヌメです
Herokuでマルチ(バーチャル)ホストを実現してかしゆかをお祝いする

おめでとうございます。本日はかしゆかの誕生日、良い休日ですね。元気に過ごされていますか、しょっさんです。
Heroku Advent Calendar 2018 23日目、一人で4本目になります、ホント申し訳ない。

かしゆかをどのようにHerokuでお祝いするかと一所懸命考えていたときに、ふと昔作ったテストのサイトを思い出したので、そちらを紹介します。ふくすうの「これはできるの？」に回答できる内容です。

- Private Space で [ACM](https://devcenter.heroku.com/articles/automated-certificate-management)は使えるの？
- Heroku でマルチ(バーチャル)ホストは使えるの？

答えはともに「YES」です。具体的な実装方法です。

# [Automated Certificate Management in Private Space](https://devcenter.heroku.com/changelog-items/1425)

2018/5/24に紹介されていますが、`ACM`機能は Private Spaceでも利用可能になりました。`ACM`とは、Let's Encrypt証明書を自動的に発行・更新し、SSLのサイトを適用するものです。具体的な利用方法については拙作「[Herokuの運用とセキュリティ～HerokuでSSL証明書の自動化とPrivate Spacesでセキュリティを強化しよう](https://codezine.jp/article/detail/10252)」をごらんください。

Private Space利用時にも、自動的にSSL証明書を発行し、更新してくれるのお便利ですね。

# Heroku でマルチホストはどうするの？

同じくドメイン周りの設定になりますが、具体的な手順を説明します。

Herokuアプリケーションのダッシュボードから、「Settings」タブへ移動します。

中程に「Domains and certificates」があります。見てわかるように、すでに２つ登録されていますね。なんとなく想像がついたと思いますが、「Add domain」ボタンをクリックします。

<img width="1221" alt="Screen Shot 2018-12-22 at 13.37.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/37263/65c0646e-d5e9-7675-c3ca-04fc03c7459b.png">

「New domain」画面が現れますので、登録したいホスト名(FQDN)をここに入力します。すでに割り当て済みのホスト名の場合(多分、名前解決やってみてA/CNAMEなどが割り当てられていると)は、エラーが出て登録できません。
<img width="617" alt="Screen Shot 2018-12-22 at 13.37.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/37263/0f194978-c7ed-7d8c-556b-cfe01eb7d8c9.png">

先程の画面に戻ってきますと、登録したホスト名が追加されています。これで３つになりましたね。
<img width="1224" alt="Screen Shot 2018-12-22 at 13.38.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/37263/251b3dde-6e83-59b2-0303-ab9be6a4d4b9.png">

`DNS Target`という欄があります。ここが`CNAME`として登録すべきホスト名が入っています。おもむろに、ご自分で管理されているDNSサーバにて、該当のFQDNにたいして`CNAME`として、この`DNS Target`のホスト名を入れます。たいていは45〜60分で`ACM`含め登録が完了します。正常に登録されると、上２つのように`ACM Status`が「OK」となります。

## プログラム側ではどのように対処するの？

HTTP/1.1以上でアクセスしてくるの絶対のはずなので、HTTPヘッダの`host`にアクセスしてきたホスト名が入っているはずです。各言語で取得方法は変わるでしょうが、例えば Node.js + Express では次のようになります。

```javascript:index.js
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function (req, res, next) {
  const hostname = req.headers.host;
  console.log('hostname = ' + hostname);

  if (hostname.match(/^localhost/))
    res.render('local', { title: 'access to localhost' });
  if (hostname.match(/^multi.kashiyuka.info/))
    res.render('kashiyuka', { title: 'access to kashiyuka' });
  if (hostname.match(/^multi.prfm.jp/))
    res.render('index', { title: 'Heroku Meetup #23' });

  console.log('no hostname');
  let err = new Error('host not found');
  err.status = 400;
  next(err);
});
```

`localhost`、`multi.kashiyuka.info`、`multi.prfm.jp` それぞれで異なるページをレンダリングしていることがわかります。これだけです。

２つのサイト、適当にアクセスしてみてくださいね。今日のお土産はそちらです。
AAを画像に変換する(Python編)

この記事はPythonを使ってAAを画像に変換する記事です。その他の言語についてはこちらの記事を参照。
[ズレずにAAを表示するためにテキストを画像にするライブラリ色々
](https://qiita.com/xiaca/items/edd8d749ffcd5e53b000)


## ソースコード
文字列から画像への変換はPILというライブラリを使って行えます。フォントの読み込みも可能なので、AA表示対応の日本語フォントを読み込むこともできます。

```python:conv.py
# coding: utf-8

import sys
from PIL import Image, ImageFont, ImageDraw

# reload(sys)
# sys.setdefaultencoding("utf-8")
# sys.getdefaultencoding()

aa = '''\
　 　 　 　 　 ／////////////////////////　------＼/////////ヽ
　　　　　　 ////:///////////////＞　　"´　　　　　　　 ∨////////∧
　　　　　 .///////////////＞ ´　　　　　　　　　　　 　 　 ∨////////∧
　　　　　/////////／/＞ ´　　　　　　　　　　　　　　　　 　 ∨////////∧
　　　　　|///////,〃／　　　　　　　　　　　　　　　　　　 　 　 i//////////ﾊ
　　　　　|////////i/　　　　　　　　　　　　_　　--――― ､--}//////////∧
　　　　　|////////|　　　　　　　　　　　 ´　　　　ﾄ.　　　　　ヽ ＼'/////////∧
　　　　　|////////|　　　　　 ..　 イ　　　　　　　 i　＼　　 ノ　 ',　＼////////∧
　　　　　|////////| 　 .　　 ´i　　 i　　 　 　 　 ｰ|-- 斗､.　　　 ',　　＼///////∧
　　　　　|////////| ／　　　 |　　ハ　　　 ',　 ∧!　,ｨf＝ミ､　　　',ー― ///////∧
　　　　　|////////|' 　　.、＿|..斗七ヽﾄ､ 　 ヽ| u 　 {::♥::} ゞ ＼　',i///////////,∧
　　　　　|////////|　　　　　 |/i/,.ィf=ミ ヽト､!|　　 ｀¨¨¨´/　　/＼!.ﾏニ ア//////,∧
　　　　　|////////ﾊ　　　 　/ .ｨ f:::♥ﾉ 　 | / ／／／／/　／　i　　|=イ/////////∧
　　　　　|////////,∧　 　 /{　ゞ ｀¨´ ／, j/　／／／ ./イ /　 .|　　i　 i///////////
　　　　　|/////////|.ﾍ　 /　乂　／／／／／　　　 　 u　/　　 |　　|　 i!///////////
　　　　　|/////////＞j／　　　＼ 　　　　　 　 　＿　　　j/|　　.| ∧!　　!///////////
　　　　　|//////／ ∠ｨ ﾍ 　　　　＞_ 　　 　 ,ｨv´　 _)　　/ |　　|/:::::∧ .|V//////////
　　　　　|//////ゝ---一 ﾍ　　ゝ----' u 　 ゝ-　´　 　 /i .|　　|:::::::::::∧!::∨/////////
　　　　　|//////////|　i　∧　　　　',≧=-　　 ＿＿　.イ　!ﾊ　　|:::::::::::::＿:::乂////////
　　　　　|//////////| ∧　∧　　　ト{ 　　　}　　　　i　　　 {ｰﾍ　!´￣　／ アニ≧= ---
　　　　　|//////////|/::::ﾍ.　 ',　　 |从　__ノi　　　　',　　　ﾉ　 ﾍ|　　／ ／ニニニニニニ
　　　　　|//////////|:::::::::::＼{ﾍ　 .|-＜　　 ゝ　　　 r ､ -､　　　　 /　 /ニニニニニニニ
　　　　　|/////////ノ==-＜　　 ',　|　　　　　　　　 r' 　 く　　　　　　./ニニニニニニﾆﾆ
　　　　 .ﾉ//＞≦ニニニニニ＼　 }/　　　　　　　 　 ｀ ´ ＼＼　　　　/ニニニニニニニニ
　　　 .//／ニニニニニニニニﾆ＼　　　　　　　　　　　　　 ｀´　　　　{ﾆﾆニニニニニニニ
　　　 .イニニニニニニニニニニニヽ　　　　　　　　　　　　　　　　　 /ニニニニニニニﾆﾆ
'''


lines = aa.split("\n")

font = ImageFont.truetype("../fonts/Saitamaar.ttf", 17)
w,h = max(font.getsize(line) for line in lines)

imag = Image.new("RGB", (w, h*len(lines)), "#ffffff")
draw = ImageDraw.Draw(imag)

for i,line in enumerate(lines):
    draw.text((0, i*h), line, font=font, fill="#000000")

# 表示
imag.show()
```

上記ソースコードを実行すると画像が生成されます。ちゃんと♥も出力されています。

![tmp0pf9y1jc.png](https://qiita-image-store.s3.amazonaws.com/0/165335/22086b33-913e-6941-4f6e-8cb0190d41e9.png)

### 注意
上記ソースコードをpython2.7の環境で実行したら日本語が文字化けしてしまいました。encodingがasciiなのが原因な気もしますが、また改めて原因探ってみたいと思います。
![tmp62KK4k.png](https://qiita-image-store.s3.amazonaws.com/0/165335/72a7056c-e274-9b90-7cb8-528892d84f68.png)

## ソースコード
https://github.com/AAHub/AAToImage-Sample
Packer で GCP のイメージ作成を CircleCI 経由でやってみる

# Packer で GCP のイメージ作成を CircleCI 経由でやってみる

前に AWS のイメージ作成のやつで、[Packer でイメージ作るのを CircleCI でやってみる](https://qiita.com/okaru/items/2d9a90d8383f9a3bc5ce) というのをやったので、その GCP 版をやってみたいと思います。

流れ的には、前回のものとほぼ一緒なので、違う点だけ書いていきます。

## 前提条件

- CircleCI の Contexts に `GCP` を作成し、`AUTH` と `PROJECT_ID` を登録
- GCP にサービスアカウントを作成して、GCE とストレージあたりに権限つけ、ダウンロードした キーは base64 エンコードして、CircleCI の Contexts の GCP の `AUTH` に入れておく

## ソース

今回は、github に用意してみました。

https://github.com/okaru/circleci_packer_gcp

ファイルは2個です。

```build.json
{  "variables": {
    "project_id": "{{env `PROJECT_ID`}}"
  },
  "builders": [
    {
      "type": "googlecompute",
      "account_file": "account.json",
      "project_id": "{{user `project_id`}}",
      "machine_type": "f1-micro",
      "source_image_family": "ubuntu-1804-lts",
      "region": "asia-northeast1",
      "zone": "asia-northeast1-b",
      "image_description": "Ubuntu Machine Image",
      "image_name": "ubuntu1804",
      "disk_size": 10,
      "disk_type": "pd-ssd",
      "ssh_username": "root"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sleep 30",
        "sudo apt-get update",
        "sudo apt-get install -y nginx"
      ]
    }
  ]
}
```

```.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: hashicorp/packer:1.3.3
    working_directory: ~/packer
    steps:
      - checkout
      - attach_workspace:
          at: ~/packer
      - run:
          name: Build 
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              echo $AUTH | base64 -d > ./account.json
              packer build --force build.json
            fi
          no_output_timeout: 30m
workflows:
  version: 2
  build-and-deploy:
    jobs:
      - build:
          context: GCP
```

前回の時と違うのは、サービスアカウントのキーの扱いですね。
GCP のサービスアカウントのキーは、ダウンロードした JSON を base64 でエンコードしておきます。エンコードしたキーは CircleCI の Contexts に作った GCP の AUTH に登録します。

ちょっと面倒だったのが、base64 の処理で、今回は docker 上で動いてる関係で、オプションが微妙に違っていてエラーが出たりしたとこでした。

## ではやっていきます

1. github のレポジトリを CircleCI 上で `Set Up Project` します
2. `Start Building` を押します
3. `SUCCESS` したら、GCE のイメージを確認します

まぁ、そんなに難しくないですね。
前回と流れはあんまり変わらないと思います。

もしかすると、GCP の権限でひっかかるかもしれないですが・・・

## まとめ

GCP でも CircleCI 連携で Packer のイメージ作成ができました。
これで、プッシュすればイメージが作成されるという環境が構築できると思います。
何度プッシュしても大丈夫なように、ビルドオプションに `--force` つけてます。
class内constに "DEFAULT" をつかったら phpcs がインデント数の警告を出すようになった


phpcs通したらなぜか2インデントでOKなところで

```
Line indented incorrectly; expected at least 3 spaces, found 2
```

と「インデント数たりねーぞ」ってエラーを起こすようになったので何でだろうと思って追っかけてみたら class内の constで "DEFAULT" をつかってたのが原因でした。

```php
class SortRule {
	const DEFAULT = 'default';
	
	const SORT_OPTIONS = [
		// 選択肢
	];
	
	// 以後メソッド。
}
```

こんなコードだと const DEFAULT の行以降のインデントが不足してるって警告されます。

ちゃんとphpcsのコードみたわけじゃないですが、siwth case文のdefaultと勘違いしてるのかもしれないですね。

DEFAULT を DEFAULT_KEYに変更したら問題なくなりました。

phpcs1.x系だから発生するのかもしれません…
アソシエーション先のカラムでwhere,orderメソッドを使う

意外と記事がなく、詰まったので記事にしました。

例えば

```
class Movie < ApplicationRecord
  has_many :actors
end
```

```
class Actor < ApplicationRecord
  belongs_to :movie
end
```

という関係になっているとき

controller上で
actorのファンがnilでない映画をDBから抽出したいと思ったときは、（雑）

```
class MoviesController < ApplicationController
  def hoge
    Movie.includes(:actors).where("actors.fan_count not ?", nil)
  end
end
```

でデータを抽出できます。

actorのファンが多い順に映画を並べたいときは、

```
class MoviesController < ApplicationController
  def hoge
    Movie.includes(:actors).order("actors.fan_count")
  end
end
```

で並べられます。

#####「重要」
それぞれ指定しているのは


`.メソッド("テーブル名.カラム名")`

になります。

自分の場合、名前の語尾がxの**index**モデルを作ったときに、rails側でテーブル名が**indices**となり、なかなか指定できずにずっとエラーになってしまいました。；；
（ORマッパー頼りでSQL読めないなんて言えない・・・）

しっかりと指定したいアソシエーション先のテーブル名を確認し、指定してあげるようにしましょう。

#####「補足」


>actorのファンがnilでない映画をDBから抽出したいと思ったときは、

こちらは

```
class MoviesController < ApplicationController
  def hoge
    Movie.includes(:actors).where(:actors {fan_count: :nil})
  end
end
```

とシンボルで記述できます。

orderでdescの並べ替えをしたいときは上の文のnilをdescにしても上手くいかなかったので（出来ない？）、descのときは文字列""で記述してあげましょう

#####その他
基本的な記述はリファレンスを参考にしましょう
[whereリファレンス](http://railsdoc.com/references/where)
[orderリファレンス](http://railsdoc.com/references/order)

Matzもシンボルを廃止しようとしていたしい（笑）
[We tried & failed.(Matz)](https://twitter.com/yukihiro_matz/status/916083723589656576?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E916083723589656576&ref_url=https%3A%2F%2Ftechracho.bpsinc.jp%2Fhachi8833%2F2018_01_10%2F50578)
LPIC 102 Version 4.0を受けてきた

[101 Version 5.0の話はこちら](https://qiita.com/iowanman/items/d0d8c944a5357a9217e8)

LPIC 102 Version 4.0を申し込む方法は[こちら](https://qiita.com/iowanman/items/d91045bc5b81ac155ac2)


##教材
ping-t 有料
スピードマスター Version 4.0 2015年初版

##勉強方法
スピマスを一周やる。
ping-tの問題集を全部金にする。まずは銀にするのが一番しんどい。

いろいろな試験のレビューをみていると記述問題が多いらしいので、コマ問やる。


##教材感想
スピードマスターは安定のスピードマスター
ping-tのコマ問の使いにくさは異常

##試験感想
めっちゃ簡単やった。上記２つでほぼ完全カバー とかいいｂながら７００点しか取ってない
正解の選択肢or記述が、後々の問題文中に出てくる箇所が３箇所あって笑った。
/etc/shadow
/etc/hosts
などなど。

101 Version 5.0 で心を折られかけてめっちゃビビってコマ問やりまくったおかげ。

##注意事項
###その１ （バージョン違い）
**ここの感想はVersion4 を勉強して LPIC Version 4を受けた感想です。**
僕の経験上、Version 5.0はVersion 4.0から大幅変更がありそうなので、早めに受験しましょう。

###その２ (認定)
LPIC Level1に関しては、Version4 と Version5を混合して受験しても認定されるようです（経験談）
ただし、公式なアナウンスがあるかは知りません。

###その３ (LinuC)
噂では、2019年3月31日までにLPIC1に認定されるとLinuC1も認定される、とありましたが**ガセ**です。

LPIC認定者 試験受験者向けLinuC認定取得 無料優待プログラム [LPI-JAPAN](https://linuc.org/linuc/lpic201809.html)

**対象者は2018年8月31日時点までにLPICに認定されてる人**だけのようです。
そもそもLinuCなんて世界で通用しない「日本独自（笑）」な資格を受ける理由がまったく思い当たりません。日本独自のディストリビューションでも作成するのでしょうか？
受験料の値引きもなければ、試験内容もほぼ同じという。利権の臭いしかしないです。
（そもそも受験料がボッタクリ）
RAZER blade 15 にUbuntu18.04とCUDA10をインストールしてみた / Ubuntu18.04 and CUDA10 install on RAZER blade 15

## 動機
機械学習環境持ち歩きたい！！
Windowsは嫌だ！！
MacはCUDA使えない…
Dual Bootは美しくない！！

かろうじてもち歩けてGPUもそこそこパワフルなRAZERのblade 15インチにUbuntu入れれば最強じゃね？

と、言うことでやってみた。
> bladeへのubuntuインストールは自己責任で行ってください。
> 良い子は真似しないほうが無難です

## Ubuntu　install on Blade

### Boot usbを作る
適当にBoot USB作ります。  
[Etcher](https://www.balena.io/etcher/)を使って作るのが簡単なので、おすすめです。  
Ubuntuは18.04を使用します。   
16.04だとトラックパッドやwifiのドライバーがインストールされないため、使用可能にするまでに時間がかかります。

### Ubuntuをインストール
 1. F12キーを押しながら、Bladeを起動
 2. Bootデバイス選択画面で、Boot USBを選択
 3. 画面に沿ってUbuntuをインストール


## Ubuntuの設定

### Wifiが遅い
インストール直後は無線の通信速度がめちゃ遅いです。  
どうやら、802.11nとIntelチップに問題があるようです。　[参考URL](https://askubuntu.com/questions/1029723/slow-wifi-since-updating-to-18-04)  
とりあえず、参考ページにそって以下のコマンドを叩くことで、wifiの速度が早くなりました。  

```bash
$ sudo modprobe -r iwlwifi
$ sudo modprobe iwlwifi 11n_disable=1

#設定を永続化するために以下のコマンドも叩きます。
$ echo "options iwlwifi 11n_disable=1" | sudo tee /etc/modprobe.d/iwlwifi.conf
```


## CUDA-10のインストール
[CUDA](https://developer.nvidia.com/cuda-downloads)のダウンロードページでCUDAをダウンロードします。  
ダウンロードオプションは以下の通りです。  
 * Operating System : Linux
 * Architecture : x86_64
 * Distribution : Ubuntu
 * Version : 18.04
 * Install Type : deb(local)

ダウンロードが終わったら、以下のコマンドでインストールします。

```bash
$ sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda
```
インストール中にMOK(machine owner key)の設定が求められます。  
適当にPWを入れましょう。

> bladeはMax-QのGPUを使用しているせいか、GPU Driverの切り替えにはUEFI Secure Bootして変更するみたいです。  

よく知りません。 


インストールが終了したら、再起動します。

再起動画面の途中で、UEFI Secure Bootメニューが出てきます。  
enroll MOKを選択し、設定を書き換えます。

再起動が終了したら、下記のコマンドでGPU情報が出ればインストール終了です。  


やったね！
第15回VR技術者認定試験（セオリーコース） 模範解答の予想

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の23日目の記事です。

日本バーチャルリアリティ学会 » VR技術者認定講習会・試験
https://vrsj.org/events/seminar/

試験終了後に教科書等を確認をして予測した模範解答ですので誤っている場合があると思います。その場合は編集リクエストかコメント等いただけますと幸いです。

公式の模範解答は2019年1月下旬に出るそうです。

ちなみに自己採点したところ、76問中60問正解で正答率は約79%でした。

**※2019/01/21追記**


回答が発表されました。全問予想通りです。(31に関しては全員正解)

[模範解答](https://vrsj.org/wp-content/uploads/2019/01/15_mohan.pdf)

# 模範解答の予想

※ 第1問(a)2: オ→エに修正しました

|問題番号|　|　| 解答 |
|---|---|---|---|
|第1問|(a)|1|エ|
|　　 |(b)|2|イ|
|第2問|(a)|3|ウ|
|　　 |   |4|ア|
|　　 |   |5|オ|
|　　 |   |6|ウ|
|　　 |(b)|7|イ|
|第3問|(a)|8|イ|
|　　 |(b)|9|ア|
|　　 |(c)|10|ウ|
|　　 |(d)|11|ウ|
|　　 |(e)|12|ア|
|第4問|   |13|イ|
|　　 |   |14|ウ|
|　　 |   |15|ア|
|　　 |   |16|エ|
|　　 |   |17|オ|
|第5問|(a)|18|オ|
|　　 |   |19|イ|
|　　 |   |20|イ|
|　　 |(b)|21|ア|
|　　 |   |22|イ|
|第6問|(a)|23|ウ|
|　　 |(b)|24|オ|
|　　 |(c)|25|ア|
|第7問|(a)|26|ウ|
|　　 |   |27|ア|
|　　 |(b)|28|エ|
|　　 |   |29|オ|
|　　 |   |30|イ|
|第8問|(a)|31|エ[^1]|
|　　 |(b)|32|イ|
|　　 |(c)|33|エ|
|　　 |   |34|ウ|
|第9問|(a)|35|エ|
|　　 |(b)|36|ア|
|　　 |(c)|37|エ|
|第10問|   |38|オ|
|　　  |   |39|イ|
|　　  |   |40|エ|
|第11問|   |41|イ|
|　　  |   |42|ウ|
|　　  |   |43|ア|
|　　  |   |44|イ|
|　　  |   |45|ウ|
|第12問|   |46|イ|
|　　  |   |47|ウ|
|第13問|   |48|オ|
|　　  |   |49|エ|
|　　  |   |50|ウ|
|第14問|   |51|イ|
|　　  |   |52|オ|
|　　  |   |53|ウ|
|第15問|(a)|54|オ|
|　　  |(b)|55|エ|
|第16問|   |56|イ|
|第17問|(a)|57|ア|
|　　  |   |58|ウ|
|　　  |(b)|59|ア|
|　　  |(c)|60|エ|
|　　  |(d)|61|エ|
|第18問|(a)|62|イ|
|　　  |(b)|63|オ|
|　　  |   |64|ウ|
|　　  |(c)|65|エ|
|　　  |(d)|66|ア|
|第19問|(a)|67|イ|
|　　  |   |68|エ|
|　　  |   |69|イ|
|　　  |(b)|70|ウ|
|　　  |   |71|ア|
|　　  |   |72|イ|
|　　  |   |73|ウ|
|第20問|(a)|74|エ|
|　　  |   |75|ア|
|　　  |(b)|76|イ|



[^1]: [第13回(セオリーコース)](https://www.vrsj.org/wp-content/uploads/2017/07/20170624shiken.pdf)第７問(a)26と同一の内容で、[模範解答](https://www.vrsj.org/wp-content/uploads/2017/07/20170624kaitou.pdf)には「本試験において，問題番号26の選択肢に不備がありました．深くお詫び申し上げるとともに，該当する設問については全員正解として採点させて頂きました．」と記載があります。そのため、今回も同様の対応になると思います。

# まとめ

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の24日目は[『バーチャルリアリティ学』１〜４章まとめ](https://qiita.com/nkjzm/items/9a897b005c6640ef242a)です。
adbコマンドが実行できない時の対処法

#adbコマンドが実行できない時の対処法

*AndroidStudioが入っていることが前提*

**原因**

+ adbコマンドにPathが通っていない。

**対処法**

+ adbコマンドが存在するPathを探し、adbコマンドにPathを通す。

##adbコマンドのPathの通し方
###adbコマンドが存在するPathを探す
右下の Configure > Project Default > Project Structure をクリック。
![AndroidStudio_起動画面](https://qiita-image-store.s3.amazonaws.com/0/328735/00a28632-3338-6869-9873-816bf49e2087.png)
 AndroidSDK location内のPathをコピー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/328735/4ca32166-5d6e-7c8a-a694-d620a54d99a8.png)
adbコマンドは「Sdk」フォルダ内の「platform-tools」フォルダ内に存在します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/328735/af41b963-b283-3859-0ba9-5bb2e82c7344.png)
adb.exeがadbコマンドです。

###adbコマンドにPathを通す
「システムのプロパティ」を開く。
「環境変数」ボタンを押下、システム環境変数欄の変数Pathをクリックして「編集」ボタンを押す。
「新規」をクリック、先ほどのplatform-toolsまでのPathを入力する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/328735/8a282176-f215-cf87-e503-1f78d8cd633f.png)
環境変数名の編集を「OK」で終了し、環境変数を「OK」で終了し、システムのプロパティを「OK」で終了する。

##その後AndroidStudioを再起動すれば、adbコマンドが使えるようになります。
【Oracle分析関数】サブクエリを使わない平均値以上のデータ抽出方法

###【概要】
下記記事を見て、どうにかしてサブクエリを使用しないで平均値以上のデータを抽出できないものかと考えました。
ちょうど分析関数を勉強していたところ、分析関数を使用して同じ結果が出せました。

[SQLでサブクエリを使って平均値以上を抽出する](https://qiita.com/yosuke_kato/items/7925447a2745650d9db3)

###【環境】
・Windows8.1
・Oracle 11.2.0
・SQL Developer バージョン4.1.5.21
※インストール方法については下記を参照してください
　　[[備忘録]vagrantでOracleインストール&SQL Developerで接続する](https://qiita.com/Nobu12/items/ce519e6db7d8d3b4d744)

###【テストデータ作成】
```sql
CREATE TABLE BASEBALL_TEAM_HIT(team_id, team_name, hit) AS
SELECT '001', 'Red Sox', 10 FROM DUAL UNION ALL
SELECT '002', 'Cubs',    20 FROM DUAL UNION ALL
SELECT '003', 'Indians', 30 FROM DUAL UNION ALL
SELECT '004', 'Rays',    40 FROM DUAL UNION ALL
SELECT '005', 'Braves',  50 FROM DUAL;
```
※hitの平均値は30

###【SQL】

####①サブクエリを使わない平均値以上のデータ抽出

■SQL
MINUS演算子でhitがNULLのデータを除外しているところがミソです。

```sql
SELECT
    team_id
   ,team_name 
   ,CASE WHEN
        hit >= AVG(hit) OVER() then hit 
    END hit
FROM BASEBALL_TEAM_HIT
MINUS
SELECT team_id, team_name, NULL FROM BASEBALL_TEAM_HIT;
```

■実行計画
![サブクエリなし.png](https://qiita-image-store.s3.amazonaws.com/0/121997/dbf64a02-9c48-a8aa-dd42-6d7fdc763771.png)


####②サブクエリを使う平均値以上のデータ抽出

■SQL

```sql
SELECT *
FROM BASEBALL_TEAM_HIT
WHERE 
    hit >= (SELECT AVG(hit) FROM BASEBALL_TEAM_HIT);
```

■実行計画
![サブクエリあり.png](https://qiita-image-store.s3.amazonaws.com/0/121997/e4204e3f-0cfe-bfe1-4b8c-533dda0e5ab7.png)

###【SQLの実行結果】
| TEAM_ID | TEAM_NAME | HIT|
|:--------|:----------|:---|
| 003     | Indians   | 30 |
| 004     | Rays      | 40 |
| 005     | Braves    | 50 |


###【参考サイト】
・[図でイメージするOracle DatabaseのSQL全集 第3回 分析関数](https://www.oracle.com/technetwork/jp/articles/otnj-sql-image3-1-323602-ja.html)
hyperapp用のstyled-componentsみたいなのをつくった

## 目的

hyperappでstyled-componentsみたいにスタイルを書いてみたかった。

## hyperapp

[こちら](https://qiita.com/JorgeBucaran/items/c48446babe0627e25ee6)をごらんください
あと、[picostyle](https://qiita.com/morishitter/items/df74dea8d4cecfcf6dec)というスタイル書くやつがすでにあるので、ごらんください

## 作ったもの

https://www.npmjs.com/package/hyper-styled

## できること

styled-componentsみたいに書ける

```tsx
const Element = styled.div`
  background-color: yellow;
`;

<Element>Yellow</Element>
```

独自のattributesを渡すこともできる

```tsx
const Element = styled.div<{ color: string }>`
  background-color: ${({ color }) => color};
`;

<Element color="blue">Yellow</Element>
```

div以外もある

```tsx
const Button = styled.button`
  background-color: yellow;
`;
```
## できないこと

擬似要素→できるようにした

```tsx
const Paragraph = styled.p`
  &:before {
    content: "> "
  }
`;
```

アニメーション

```tsx
const Animation = styled.div`
  @keyframes {
    0% {
      color: yellow;
    }
    100% {
      color: blue;
    }
  }
`;
```

wrap関数でさらにラップしたエレメントを作る→できるようにした

```tsx
const Original = styled.div`
  background-color: yellow;
`;

const Wrapped = wrap(Original)`
  font-size: 32px;
`;
```

ただし、hyperappのコンポーネントに対するスタイルはうまくいかないので注意。

## しくみ
styled-componentsみたいに要素にユニークなidを振るようにして、そのidに合致するようにcssを吐く。

```tsx:code.tsx
const Div = styled.div`
  color: yellow;
`;
```
↓

```html:html
<div data-style="hhygaw">foo</div>
<style>
*[data-style=hhygaw] {
  color: yellow;
}
</style>
```

性能とかは何も考えていないので、再描画の度に`<style>`を書き換えている。
個人賞の歴史

たぶんこの記事を求められていると勝手に想定ました。
なので、今まで私が行ってきた個人賞の流れをまとめてみました。
変な活動をしてきた人がいるんだと楽しんで頂ければ幸いです。

## 始めたきっかけ
そもそも、理念があったわけでなく、
ハッカソンでもらった副賞を使わずに放置するのはもったいよね。。という所から始まってます。
みなさんの家にも、ノベルティや、Tシャツや、謎の機器余ってますよね？

## MA11 ハッカソン予選大阪

初めて実施したのは、2015年の大阪ハッカソンです。
無理を言って入れてもらったのが最初です。

記念？すべき第一回目
この時の副賞は大変豪華でした。
授賞理由は、発表を寸劇のデモだけでやり遂げたところだったと思います。
![MA11 ハッカソン予選大阪](https://farm1.staticflickr.com/638/21920208848_2ef69d343d.jpg")

[ハッカソンレポート＠大阪](https://ma2017.we-are-ma.jp/2015/10/ma11_osaka_hackathon/)

## 楽器ソン@大阪
2回目は、大阪で実施された楽器ソンです。
この時より、個人賞を他の方からも募集するようになりました。
審査のないハッカソンだったため、個人賞はぴったりでした。

※前回良い副賞を出した結果、今回はガラクタ扱いされてしまいました。。
![楽器ソン@大阪](https://farm9.staticflickr.com/8869/28639023911_a856f626f9.jpg")


ここで印象的だったのが、
チームではなく、特定の個人や、チームメンバーに対して賞を贈られていた方がいた事です。
人を褒めるって超いいなと改めて感じました。

[楽器ソン@大阪](https://ma2017.we-are-ma.jp/2016/08/hackathon_gakkison/)


## バッカソン＠大阪
個人賞2年目。
前回、家のお菓子とか、様々なものをかき集めて副賞作りました。
![バッカソン＠大阪](https://farm6.staticflickr.com/5464/30917736826_6d8437eb19.jpg)


実は、この時初めて個人賞的なものを頂きました。
貰えるとめっちゃうれしいです！
![バッカソン＠大阪](https://farm6.staticflickr.com/5743/22775345018_131e847bf9.jpg)

[バッカソン＠大阪](https://ma2017.we-are-ma.jp/2016/11/hackathon-oosaka/)

## 遊びのReハック

参加者も、審査員も、じゃ―出す！くらいのノリで
時間が押しまくるほどの個人賞を出して頂いたハッカソン。

ブログの写真を見て頂いたらわかると思いますが、
受賞者も、授与者もみんないい笑顔なんです！

賞名の付け方に、今年やった個人賞の色が見えてきてます。
![遊びのReハック](https://farm5.staticflickr.com/4493/36898438533_5aa463481d.jpg)

[遊びのReハック](https://ma2017.we-are-ma.jp/2017/10/hackathon-oosaka2017/)

## 楽器ソンAgain2018

4年目にもなると、個人賞の為に、副賞を集めるのが日課になってたりしてます。
特にTシャツやノベルティなどは、使わずにストックするようになりました。
そのおかげなのか、今年は2つの賞を用意してます。

![楽器ソンAgain2018](https://qiita-image-store.s3.amazonaws.com/0/189829/371cc10a-2b33-6ce4-ae89-57c311ffd49f.jpeg)

何気に初めて個人を選びました！
初めて賞をもらったらしく、めっちゃ喜んでいただけたのが印象に残っています。

![楽器ソンAgain2018](https://qiita-image-store.s3.amazonaws.com/0/189829/579bca7f-add0-03e5-2408-8cfd26137c32.jpeg)


[楽器ソンAgain2018](https://protopedia.net/blog/2018/11/gakkithonagain2018)


### MashupAwards Heroes League


###### 
そして今年からMashupAwardsで正式に採用された個人賞
[やまも](https://twitter.com/kotobuki555ing)さんにデザインいただき、A5サイズの表彰状を準備し、
地方予選から、部門賞決勝、セカンド、フェスタで皆さんに使っていただきました！

今までの経緯より、

* **賞を贈る人が嬉しい**
* **もらった人が嬉しい**


各イベントごとに、個人賞はこんなメリットがあると説明していただきました。

###### 実際にやってみて
毎年、自分の作品が一番だと思ってます。
良い結果がでなくて、
あれ。。自分の感覚とずれてる？と悩むことも良くありましたが
自分の作品を好きだと言ってくれる人が居てると、
あ、興味を持ってくれてる人がいた！という満足感がすごかったです。

![MashupAwards Heroes League](https://qiita-image-store.s3.amazonaws.com/0/189829/9c1f91bf-15df-5c41-3cb1-2be02d47c261.jpeg)


そして、実際に使って頂いた方々から、
こんな効果があること教えていただきました。

* **交流のきっかけになる**


私こう見えて、人見知りです。
なので、いつも話しかけるキッカケは
「名刺交換させてもらっていいですか？」
でした。
名刺を持たれてなかったり、切れてたりすると会話を続けにくくなるのです。。。

でも、「好きです」「凄いです」「面白いです」から始まる個人賞だと、話しかけやすく、話も続くんです！

気軽に賞状を贈れる今回だからこそ気づけたと思います。

###### めっちゃ嬉しかった個人賞

フェスタの最後で頂いた個人賞
まさか個人賞で個人賞をいただけるとは思っていませんでした。
本当に嬉しかった！！

![MashupAwards Heroes League](https://qiita-image-store.s3.amazonaws.com/0/189829/5274d8ca-2edb-0ff8-501a-f6e951e0ad0c.jpeg)

[沢山の個人賞](https://hashtagtile.firebaseapp.com/#MA_2018)


# 最後に
もったいないから始めた個人賞でしたが、大阪のノリの良さ、
賛同してくれる方のおかげで、私が思ってる以上にいろいろ効果があるのだと、自分でもびっくりしています。

もし、気に入った方がいらっしゃいましたら、
ハッカソンだけでなく、LT大会など、いろいろなイベントで実施して**WOW**を広げていただければ嬉しいです！
LFの改行コードを"\n"という改行コード文字列に変換する

#はじめに
stringsやpodfileで指定する文字列には、Swiftの"""が使えないので\nによって改行を表現する必要があります。
LFの改行コードを"\n"という改行コード文字列に変換する方法について。

もともとこういうテキストだったものを

 ```Before.txt
abc
def

ghi
 ```

こうしたい場合の方法を書きます。

 ```After.txt
abc\ndef\n\nghi
 ```

#やりかた
(エディタは何でも良いですが、[CotEditor](https://coteditor.com)などは軽量でおすすめです。)
1. LFコードのテキストを正規表現の置換を扱えるエディタで開きます。
2. 正規表現を使うモードで、検索対象として"\n"を与えます。
3. 置換文字列として"\\n"を指定します。
4. すべて置換します。

#関連記事
ダブルクォーテーション `"`が含まれる場合は、 `\"`に置換する必要があります。この記事で説明しています。
[冒頭文つきで、CocoaPods経由のOSSのライセンス表記を自動化する](
https://qiita.com/hsylife/items/5f1e7bdd7de0fd60532f)
コマンドプロンプトでGoogle file Stream 内のファイルを参照する方法

##Google File Stream を一覧化したい！
- Google Driveのファイル一覧を取得
- ただ手間を掛けたくない
→そんな方におすすめ

**cdでGoogle file Stream に移動できない…**
Drive内のcsvファイルをコマンドプロンプト（以下、cmd）でユニオンしたいなぁ。
そんな思いでcd G:...で移動しようとすると、、、できない。

Box DriveだとできるのにGoogleさん辛い…。






**dirで表示**
結局、ファイル作成も分からず、誰か分かる人もネットでも見つからなかったので、
次のことができたので記録します。誰か上記わかる方教えてください…(泣)

dir G:... これで一覧リストは閲覧できました。
あとは誰かに託します…。
Element UIのラジオボタンでラベルなしのボタンを作りたかった

業務で設計書に沿って画面を作成していたのですが、タイトルにあるように、ラベルのないラジオボタンを使う部分がありました。

イメージとしては下のような動きをさせます。
![1545447906218.gif](https://qiita-image-store.s3.amazonaws.com/0/185028/b33ba772-8ee0-29d3-0fcb-341226d3bc13.gif)

ラジオボタンは使う/使わないのどちらかだけ選択できるようになっています。

今回の業務では、画面を作るにあたってVue.jsのコンポーネントライブラリである、ElementUIを使用していました。
公式ドキュメントは[こちら](https://element.eleme.io/#/en-US)

ElementUIを使用したラジオボタンは`el-radio`というタグを作って作成します
実際に動かすことができる[ドキュメント](https://element.eleme.io/#/en-US/component/radio)が非常にわかりやすいです。

はじめは、タグの中の文字を消せば良いと思っていました。

```vue
  <el-radio v-model="radio" label="1"></el-radio>
  <el-radio v-model="radio" label="2"></el-radio>
```

出力
<img width="151" alt="スクリーンショット 2018-12-22 12.27.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/185028/2b037433-d9ef-1dfc-91e0-8303e6eb55b0.png">

(´・ω・`)・・・
labelプロパティの中身が表示されています。

ちなみにlabelプロパティも消すと、ラベルなしのラジオボタンが出来ますが、片方を選択するともう片方も選択されます。v-modelでバインドしている要素が全く同じなので２つのボタンの違いがなくなってしまうからですね。

ではどうすればよいのでしょうか。
ここで、よく見てほしいのはドキュメントにあるラジオボタンの実装コードです。
labelプロパティの内容が1にもかかわらず、<el-radio>で囲まれた`Option A`が表示されています。
つまり、タグで囲まれた文字の出力が優先されるわけです。

ということは、空文字をタグの中に入れればラベルなしのボタンが出来上がるはずです。
とはいえ、html上にただスペースを入れても意味ないので、 `{{ '' }}` と書きます。
Laravelを使用しててbladeの中に書く場合は`@{{ '' }}`でOKです。

```vue
<el-radio v-model="radio" label="1">{{ '' }}</el-radio>
<el-radio v-model="radio" label="2">{{ '' }}</el-radio>
```

出力
![1545450263524.gif](https://qiita-image-store.s3.amazonaws.com/0/185028/9a13cb4b-6763-19d1-8efc-ec6fae49756f.gif)

あとはtable使って並べれば一番上のような表示が出来ます。

他になにかスマートが書き方あれば教えてください:pray: