OmniAICreator/Qiita-1.07M huggingface dataset:
Rails から S3 にテキストファイルを保存する

## やりたいこと
Rails アプリからテキストを S3 に保存して、それを URL から参照する。

## 準備

今回は AWSさん直々に用意してくれている aws-sdk を使った。

```Gemfile
gem 'aws-sdk'
```
注意) aws-sdk の最新バージョンは2.0系で、1.0系の記事も多く出ており、書き方等変わっているので自分の使っている gem のバージョンにあった方法でやる必要がある。
というか上げた方がいいと思う。

## いざ aws-sdk をいじろう
aws-sdk は本当に様々な機能を用意してくれている。
今回やりたいこと(Railsアプリから S3 にテキストを保存する)も含めて、S3内の リソースを操作するのに主に

* Aws::S3::Client
* Aws::S3::Resource

の2つがある。今回テキストを渡すのは後者の Aws::S3::Resource で行った。

## 設定ファイル
まずはじめに S3 につなぐために、AWS のアクセスキーやらシークレットキーなどが必要になるので設定する。
config/initializers/aws.rb に設定を書き込む。

```config/initializers/aws.rb
Aws.config.update({
  credentials: Aws::Credentials.new('AWS のアクセスキー', 'AWS のシークレットキー'),
  region: 'ap-northeast-1'
})
```

## 保存
続いてバケット名 "sample_bucket" のバケットの
/uploads/texts/sample.txt にテキストを保存するには下記のようになる。

```s3_controller.rb
def save_text
  text = 'このテキストが保存されます'

  if Rails.env.development?
    File.open(File.join(Rails.root, 'tmp', 'sample.txt'), 'w'){|f| f< << text}
  else
    s3 = Aws::S3::Resource.new
    bucket = s3.bucket('sample_bucket')
    object = bucket.object('uploads/texts/sample.txt')
    object.put(body: text, acl: 'public-read')
  end
end
```

ローカル環境ではアクションが通るたびに S3 にファイルが作成されるのはウザいので
tmp 以下に保存するようにしている。

あとは aws-sdk さんが用意してくれているメソッドを使ってバケットを指定して、さらにオブジェクトを key を使って指定して、そこにテキストを保存している。

また保存する時にオブジェクトの acl を public-read に変更して、外部から URL を叩いてオブジェクトの中身(テキスト)を参照できるようにしないといけないので注意。

これにアクセスするには
https://sample_bucket.amazonaws.com/uploads/texts/sample.txt
などでできるかと

## まとめ
たったこれだけで保存できるし、便利。
自分は RSS 保存するために使ったけどファイル形式にしてからファイルごと保存するのも似たような方法でできるので、機会があったらやってみる

コードを書いたらそれを担保するテストを書きたいのだがそれはまたの今度書こうかと。

なんやかんや言うて<a href='http://docs.aws.amazon.com/sdkforruby/api/Aws/S3.html' target='_blank'>ドキュメント</a>が充実してるのでそれ見るのが一番ww
参考も全部ドキュメントです
eZ Publish 5.x テンプレート関連

## ビューパラメーターの取得
```jinja
{{ app.request.attributes.get( 'viewParameters' ).offset }}
```

## コンテンツ名
```jinja
{{ content.contentInfo.name }}
```

## フィールドタイプの取得
```jinja
{{ content.getField( 'url' ).value.link }}
```

## フィールドタイプのレンダリング
```jinja
{{ ez_render_field( <content>, <field_name>, {
            'template': 'eZDemoBundle:fields:fields.html.twig',
            'lang': 'eng-GB'
            } ) }}
```

## 画像のレンダリング
```jinja
<img src="{{ asset( ez_image_alias( <field>, <versionInfo>, <parameter_alias> ).uri ) }}" alt="{{  <field>.value.alternativeText }}">
or

{{ ez_render_field(content, 'image', { 
                                        parameters:{ alias:'small' },
    									attr:{ class:'maClasse', custom_attribute:'value' }
									 }
				  )
}}
```

## 妥当なファイル名での ezbinaryfile ダウンロードリンクのレンダリング
```jinja
<a href="{{ path( 'ez_legacy', { 'module_uri': 'content/download/' ~
                                               <content>.contentInfo.id ~ '/' ~
                                               <field>.id ~
                                               '/version/' ~ <content>.contentInfo.currentVersionNo ~
                                               "/file/" ~ <field>.value.fileName|escape( 'url' ) }
         ) }}"/>
{{ <field>.value.fileName }}
</a>
```

## "ESI" でのコンテンツタイプのレンダリング
```jinja
 {{ render( controller( "ez_content:viewLocation", { "locationId": 123, "viewType": "line" }, {"strategy": "esi"} )) }}
```

=> *ez_content* : service definied in service.yml

=> To use Varnish, don't forget to remove EzPublishCache from index.php

## 非同期メソッドでのコンテンツタイプのレンダリング
```jinja
 {{ render( controller( "ez_content:viewLocation", { "locationId": 123, "viewType": "line" }, {"strategy": "hinclude"} )) }}
```

=> Don't forget to add hinclude.js (http://mnot.github.io/hinclude/)

## viewbaseLayout の拡張
```jinja
{% extends viewbaseLayout %}
```

=> *eZ/Bundle/EzPublishCoreBundle/Resources/views/viewbase_layout.html.twig*

## レガシー module/view への URL
```jinja
{{ path( 'ez_legacy', { 'module_uri': 'my_modyle/my_view/(param1)/value1' } ) }}
```

## コンテンツへのリンク

相対パス

```jinja
{{ path( 'ez_urlalias', {'locationId': content.contentInfo.mainLocationId} ) }}
or
{{ path( location_object ) }}
```
	
絶対パス
	
```jinja
{{ url( 'ez_urlalias', {'locationId': content.contentInfo.mainLocationId} ) }}
or
{{ url( location_object ) }}
```

## ユーザーが認証されているかどうかを確認する方法
```jinja
{% if app.security.token.authenticated %}
...
{% else %}
...
{% endif %}
```

## Twig ヘルパー

```
ezpublish.siteaccess
ezpublish.requestedUriString
ezpublish.systemUriString
ezpublish.viewParameters
ezpublish.viewParametersString
ezpublish.siteName
ezpublish.legacy
```

レガシー関連

```
ezpublish.legacy.all
ezpublish.legacy.keys
ezpublish.legacy.get
ezpublish.legacy.has
```

## レガシーテンプレートのインクルード
```jinga
{% include "design:my/old_template.tpl" with {"someVar": "someValue"} %}
```
Railsのフォームで個別にエラーメッセージを表示する


Railsでフォームを作っていて、バリデーションのエラーメッセージをまとめて表示するのではなく、各パーツの下に個別表示したい…というニーズがありました。実際、上にエラーを表示するよりも該当箇所に表示したほうがユーザビリティが向上しそうです。

エラーメッセージは、`@form.errors.full_messages`などに格納されているので頑張ればなんとかできそうです。というわけで、2つほどやり方を試してみました。

## field_error_procをカスタマイズ

わりとよく見る解決方法です。

`config/initializers/error_customize.rb` あたりにActionView::Baseの`field_error_proc`にProcをブチ込みます。

```ruby
ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
  if instance.kind_of?(ActionView::Helpers::Tags::Label)
    html_tag.html_safe
  else
    method_name = instance.instance_variable_get(:@method_name)
    errors = instance.object.errors[method_name]
    html = <<~EOM
    <div class="has-error">
      #{html_tag}
      <span class="help-block">
        #{I18n.t("activerecord.attributes.#{instance.object.class.name.underscore}.#{method_name}")}
        #{errors.first}
      </span>
    </div>
    EOM
    html.html_safe
  end
end
```

これはこれでエラー文言を割りと自在に操れるんですが、`collection_radio_buttons` `collection_select`などの複数のフォームパーツを表示するようなヘルパーを使うと、パーツ分エラー文言が表示されてしまいます。

## フォームビルダー

RailsのフォームオブジェクトはFormBuilderというクラスのインスタンスです。そしてサブクラスとして拡張することができます。これを使ってエラー文言をコントロールします。

`app/form_builders/custom_form_builder.rb` あたりにファイルを作ります。

元から定義されているヘルパーメソッドをオーバーライドしてエラーオブジェクトがあれば、それを表示し、それ以外の処理は`super`で任せるようにしています。下記コードは全てのフォームヘルパーを再定義しているわけじゃないので必要に応じて拡張してください。

```ruby
class CustomFormBuilder < ActionView::Helpers::FormBuilder
  def text_field(method, options = {})
    super + error(method)
  end

  def number_field(method, options = {})
    super + error(method)
  end

  def telephone_field(method, options = {})
    super + error(method)
  end

  def collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
    super + error(method)
  end

  def collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
    super + error(method)
  end

  private

  def error(method)
    error_html(error_message(method))
  end

  def error_message(method)
    (@object.errors[method].size > 0) ? I18n.t("activerecord.attributes.#{@object.model_name.singular}.#{method}") + @object.errors[method].first : ""
  end

  def error_html(msg)
    return "" unless msg.present?

    @template.content_tag(:div, class: "has-error") do
      @template.concat (@template.content_tag(:span, class: "help-block") do
        msg
      end)
    end
  end

end
```

そして使いたいフォームのViewで拡張したフォームビルダーを指定します。

```ruby
= form_for @form, :builder => CustomFormBuilder do |f|
```

これで完了です。簡単ですね。
eZ Publish 5.x のファイルパスまわり

## eZ Publish 5.x デフォルト設定

    eZ/Bundle/EzPublishCoreBundle/Resources/config/default_settings.yml

## フィールドタイプ（データタイプ）の宣言
    vendor/ezsystems/ezpublish/eZ/Bundle/EzPublishCoreBundle/Resources/config/fieldtypes.yml

## フィールドタイプのテンプレート
    vendor/ezsystems/ezpublish/eZ/Bundle/EzPublishCoreBundle/Resources/views/content_fields.html.twig

## content/location で使われる Controller
    vendor/ezsystems/ezpublish/eZ/Publish/MVC/Symfony/Controller/Content/ViewController.php

## 異なる設定ファイル
**ezpublish/config/ezpublish.yml** defines the siteaccess, the database
configuration, the image\_alias, set whether to directly use the legacy or not,
etc...

**ezpublish/config/parameters.yml** (included in config.yml) contains the path
to the pagelayout (ezpublish\_legacy.view.default\_layout)
eZ Publish の Controller まわり

## 特定ロケーションの viewCache の破棄

```php
$this->container->get( 'ezpublish.http_cache.purger' )->purge( $locationId );
```

## すべての viewCache の破棄
```php
$this->container->get( 'ezpublish.http_cache.purger' )->purgeAll();
```

## 子のロケーション ID の取得
```php
$currentLocation = $locationService->loadLocation( $locationId );
$currentLocationChildren = $locationService->loadLocationChildren(
    $currentLocation, $offset = 0, $limit = -1
);
$childrenLocatinoId = array();
foreach ( $currentLocationChildren->locations as $childLocation )
{
    $childrenLocatinoId[] = $childLocation->contentInfo->mainLocationId;
}
```

## 認証済みユーザーの確認
```php
$securityToken = $this->container->get('security.context')->getToken();
$userAuth = $securityToken->isAuthenticated(); // return true or false
```

## Symfony ロケールを eZ Publish に変換
```php
$symfonyLocale = $this->getRequest()->get( '_locale' );
$localeConverter = $this->container->get( 'ezpublish.locale.converter' );
$ezLocale = $ezLocale = $localeConverter->convertToEz( $symfonyLocale );
```
eZ Publish 設定まわり


カスタムローカル設定
==========================

```yml
    ezpublish:
        # Locale conversion map between eZ Publish format to POSIX. 
        # Check locale.yml in EzPublishCoreBundle to see natively supported locales.
        locale_conversion:
            eng-DE: en_DE
```
            
レガシーフォールバックの基本レイアウト
===============================

=> Second parameter is to define where to inject data

=> Third parameter is to define which pagelayout should use the system for module rendering

```yml
    parameters:
        ezpublish_legacy.my_siteaccess.view_default_layout: AcmeDemoBundle::my_layout.html.twig
        ezpublish.content_view.content_block_name: content
        ezpublish_legacy.my_siteaccess.module_default_layout: AcmeDemoBundle::layout_legacy.html.twig
```


シングルリポジトリーでのマルチサイト
================================

```yml
ezpublish:
    system:
        my_siteaccess:
            content:
                tree_root:
                    # Root locationId. Default is top locationId
                    location_id: 123
                    # Every URL aliases starting with those prefixes will be considered 
                    # being outside of the subtree starting at root_location.
                    # Default value is an empty array.
                    # Prefixes are not case sensitive.
                    excluded_uri_prefixes:
                        - media
                        - users
```

サイトアクセスマッチング: matchers
=============================

URIElement
----------

```yml
ezpublish:
    siteaccess:
        match:
            URIElement: 1
```

URIText
-------

```yml
ezpublish:
    siteaccess:
        match:
            URIText:
                prefix: foo
                suffix: bar
```

HostElement
-----------

```yml
ezpublish:
    siteaccess:
        match:
            HostText:
                prefix: www.
                suffix: .com
```

Map\Host
--------

```yml
ezpublish:
    siteaccess:
        match:
            Map\Host:
                www.foo.com: foo_front
                adm.foo.com: foo_admin
                www.stuff.fr: bar_front
                adm.stuff.fr: bar_admin

```

Map\URI
-------

```yml
ezpublish:
    siteaccess:
        match:
            Map\URI:
                something: ezdemo_site
                foobar: ezdemo_site_admin
```

Map\Port
--------

```yml

ezpublish:
    siteaccess:
        match:
            Match\Port:
                80: foo
                8080: bar
```

Regex\Host
----------

```yml
ezpublish:
    siteaccess:
        match:
            Regex\Host:
                regex: "^(\\w+_sa)$"
                # デフォルトは 1
                itemNumber: 1
```

Regex\URI
---------

```yml
ezpublish:
    siteaccess:
        match:
            Regex\URI:
                regex: "^/foo(\\w+)bar"
                # デフォルトは 1
                itemNumber: 1
```
eZ Publish / eZ Platform コンソールコマンド一覧

## キャッシュクリア
#### eZ Platform
```
php app/console cache:clear
```
```
php app/console c:c
```
#### eZ Publish 5.x
```
php ezpublish/console cache:clear
```
```
php ezpublish/console c:c
```

## 新規バンドル作成
#### eZ Platform
```
php app/console generate:bundle
```
```
php app/console g:b
```
#### eZ Publish 5.x
```
php ezpublish/console generate:bundle
```
```
php ezpublish/console g:b
```

#### オプション
* --namespace=
* --bundle-name=
* --dir=
* --format=
* --no-interaction

```
php app/console g:b --namespace=My/BlogBundle --bundle-name= MyBlogBundle --dir=src --format=yml
```

## 新規コマンド作成
#### eZ Platform
```
php app/console generate:command
```
#### eZ Publish 5.x
```
php ezpublish/console generate:command
```

## オートロードの再生成
```
php ezpublish/console ezpublish:legacy:script bin/php/ezpgenerateautoloads.php
```

## レガシーキャッシュの破棄
```
php ezpublish/console ezpublish:legacy:script bin/php/ezcache.php --legacy-help
```

## レガシースクリプトの実行
```
php ezpublish/console ezpublish:legacy:script runcronjobs.php frequent
```

## EzPublishCoreBundle の設定概要を取得
```
php ezpublish/console config:dump-reference ezpublish
```
自分の好きなサービスを成長させられる人

[ミクシィグループ Advent Calendar](http://qiita.com/advent-calendar/2016/mixi)最終日です。
何も考えずに3連休最後の日なら何か書く時間あるだろうと思って25日を選んだらトリでした。（31日まであると思ってた）

[0円からのサロン予約アプリ minimo](https://minimodel.jp)というサービスの開発チームリーダーをしているozeppiです。

さて、今回は「自分の好きなサービスを成長させられる人」というお題で書こうと思います。

最近「サービスに対して今自分は何をすべきか」ということを考えていた時、minimoの立ち上げから今までも同じように、「自分が何をしたいか」よりも「どうやったらサービスを成長させられるか、今自分は何をすべきか」という視点で考え行動していたことに気がつきました。

今までどういうエンジニアになりたいかや、今後のキャリアといったものに対する答えが自分の中に無かったのですが、これが一つの答えかもしれないなーと思ったため、minimoの今までを振り返りながら、サービスを創り成長させていく上で大事だなと思ったことを書いてみます。

# 企画フェーズ
***何も無い状態から物事を前に進めていく力***

サービスを生み出す初期は本当に何もないところから始まります。
minimoの初めはカットモデル募集というキーワードから始まり、美容業界のことを調べ、実際にカットモデルを体験して知り、誰にどんな価値を提供するのかをリーンキャンバスを作ったりしながら考え、サービスのプロトタイプを作り、ユーザインタビューの設計、実施などをしてサービスの形を固めていきました。
企画が始まったのが2013年5月頃で、開発に入ったのは夏頃だったと思います。
このように何も無いところから、何をどういうやり方でやるのかを自分達で見つけ出して物事を前に進めていく力、そんな力が必要だと思いました。

# 初期
***プロダクトをカタチにする力***

開発初期のエンジニアに一番大事だなと思うのは、プロダクトをカタチにする力、必要な機能を如何に速く実装できるかだと思っています。
いつ環境が変わるなどして無くなってしまうかもしれない新規事業においては、いかに速く実装して検証、改善を行えるかが重要です。

# 成長フェーズ
***確実に改善していける力***

はじめのうちは、サービスに足りない機能や改善点が明確です。
そのため開発する機能についてメンバー間での合意も得やすく、また効果も出やすい。
しかし改善を積み重ねていくと、簡単に思いつく改善はやり尽くし、機能は増え仕様が複雑化していき段々とヒットを打つことが難しくなってきます。

こうした状態から更にサービスを改善していくためには、課題に対して仮説を立て検証していくことのできる力が必要です。
エンジニアは改善に必要なデータを記録したり、DBや各種ツールなどから取得できるなど改善を行いやすい立場にいます。
もちろんこれらのデータを誰でも扱い易いよう管理ツールなどから他の人が見られるような仕組みを作るのも良いですが、エンジニア自身が自律的に動くことで、改善を加速させることができると思います。

***開発しない力***

開発は問題解決のためのひとつの手段です。
開発するということは、時間もかかるし場合によってはサービスをより複雑にします。
私達はエンジニアなのでつい開発することで問題を解決しそうになることもありますが、本当にそれは開発が必要なのか？その前に開発せずに試すことはできないか？など一歩踏みとどまって考える力もまた、開発の大変さを知っている私達だからこそ持っていたいものです。

# さいごに
今までminimoを一緒に創ってきた人達のすごいなと思ったところを思い返しながら書いてみました。

私はサーバサイドエンジニアを軸にしつつもJSでのブラウザ向け開発やiOS、Android開発、プロジェクトのディレクションや開発チームのマネジメントと色々してきました。
こういう行動をしていると、たまに「色々中途半端に手を出しているけどいいのだろうか」と不安に思うこともあります。
しかし最近は、課題だと感じることを人任せにしておけないのは自分の性分なので仕方がないし、こういう関わり方でサービスの成長に寄与していくのもありかもしれないと思うようになりました。

サービスが成長していくにあたって、様々な課題がでてきます。
それはサービス内の課題だけでなく、組織の課題や進め方の課題などもあります。
それらの課題にきちんと向き合い、乗り越えてサービスを成長させられる人になりたいなと思います。

# オマケ
minimoは最近かわいい[TVCM](https://youtu.be/wNjVhxxPm68)を放送していました。
まだご覧になっていない方は是非一度ご覧ください。
[Sierra] macos Sierra に更新してから、毎回パスフレーズを聞かれてくることに対する対策 [ssh]

`~/.ssh/config` へ、次のを突っ込んでおくことが望ましいようです。

```bash:.ssh/config
Host *
   AddKeysToAgent yes
   UseKeychain yes
```

## AddKeysToAgent

`man ssh_config` から

> Specifies whether keys should be automatically added to a running ssh-agent(1).  If this option is set to 'yes' and a key is loaded from a file, the key and its passphrase are added to the agent with the default lifetime, as if by ssh-add(1).  If this option is set to `ask', ssh will require confirmation using the SSH_ASKPASS program before adding a key (see ssh-add(1) for details).  If this option is set to 'confirm', each use of the key must be confirmed, as if the -c option was specified to ssh-add(1).  If this option is set to 'no', no keys are added to the agent.  The argument must be 'yes', 'confirm', 'ask', or 'no'.  The default is 'no'.

`AddKeysToAgent` オプションを 'yes' にすると、`ssh-add` 同様 `ssh-agent` へ、パスフレーズが登録されると、`man` には記述ありますが、mac osの場合、`ssh-agent` を使ってなく、`KeyChain` を使っていますので、`KeyChain` へ登録されます。

確認できていないのですが、`Sierra` の versionによっては、これが効かない場合があるようなので、最新へアップデートしてみてください。

にっちもさっちもいかない場合は、`ssh-add -K <idファイル>` で登録できます(´・ω・`)

## UseKeychain

`man ssh_config` から

> On macOS, specifies whether the system should search for passphrases in the user's keychain when attempting to use a particular key. When the passphrase is provided by the user, this option also specifies whether the passphrase should be stored into the keychain once it has been verified to be correct.  The argument must be 'yes' or 'no'.  The default is 'no'.

macOSの時だけ有効です。これを 'yes' にしておくと、mac の `Keychain` を見に行って、パスフレーズが登録されていれば、そちらを利用してくれます。
~Pythonistaより愛をこめて贈るPython入門者のためのTips③~

#はじめに
この記事は [Python Advent Calendar 2016](http://qiita.com/advent-calendar/2016/python) の25日目の記事です。
恐れ多くも最終日!!

# はじめに②
普段は [Liaro](company.liaro.me) という会社で代表をやりつつエンジニアとしてはサーバーサイドを主に書いてます。
昔書いた [Tips②](http://qiita.com/hanaken_Nirvana/items/e533e88e3d5a32cc8a2a) の続きですが、色々追われていて前ほど分量がありませんがご了承下さい。
曖昧な知識で書いている部分も多いと思うのでツッコミよろしくお願い致します！

# map,filter,reduce,lambdaというフォース
他の言語でもありますが、Pythonにもmap/filter/reduceがあり無名関数(ラムダ式)のlambdaに用意されています。
※reduceに関しては、3系では明示的にimportしなければ使えなくなりました。

```python:Python3.5.2
>>> f = lambda x:x**2
>>> f(3)
9
>>> 
>>> a = [i for i in range(10)]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = map(lambda x:x*x, a)
>>> b = map(lambda x:x*x, a)
>>> for i in b:
...     print(i)
... 
0
1
4
9
16
25
36
49
64
81
>>> c = filter(lambda x:x%2==0, a)
>>> for i in c:
...     print(i)
... 
0
2
4
6
8
>>> from functools import reduce #reduceをimport
>>> d = reduce(lambda x,y:x+y, a)
>>> d
45
>>> 
```

# デコレータ
Pythonにはデコレータという機能がありまして、メソッド名の上に`@hoge`みたいな感じでメソッドを拡張できます([こちら](http://qiita.com/_rdtr/items/d3bc1a8d4b7eb375c368)が詳しいです)。
リンク先の例が良くて、それ以外あまり思いつかず似たものになってしまいますが、
fooという関数を拡張する際に以下のように書いたとします。

```python:Python3.5.2
>>> def foo(x, y):
...     return x ** y
... 
>>>
>>> def hoge(func): 
...     def inner(x, y):
...         if x == y == 0:
...             return "不定"
...         return func(x, y)
...     return inner
... 
>>>
>>> foo = hoge(foo)
```

それがPythonでは `@` 記号を用いて以下の用に書き換えることが出来る。

```python:Python3.5.2
>>> @hoge
... def foo(x, y):
...     return x ** y
... 
>>>
```

例えば、クラス内のメソッドは基本的にインスタンスメソッドですが `@classmethod` と書くとクラスメソッドになったり `@staticmethod` と書くとスタティックメソッドになったりします。

# 関数のデフォルト値について
以前のTipsで基本的な関数での引数の扱いは書いたのですがいくつか注意点を書いてなかったのでここに書きたいと思います。

```python:Python3.5.2
>>> def foo(x, y):
...     return x ** y
... 
>>> foo(y=5, x=2) # 引数は順序より名前の一致が優先される
32
>>> 
>>> def hoge(a=[]):
...     a.append(1)
...     return a
...
>>> b = hoge()
>>> print(b)
[1]
>>> b = hoge()
>>> print(b) # デフォルト値は呼び出し時に毎回生成されるのではない
[1, 1]
```

# pycodestyleという経典
これはPythonのコーディング規約のことです。Pythonでは言語で推奨のコーディング規約があり多くのPythonユーザーがこれに従っていると思います。
以前はPEP8と呼ばれていましたが変更されました。
ただ、いきなり英語辛いなって人はPEP8でググって出てきたので基本的には問題ないです([PEP8](https://pep8-ja.readthedocs.io/ja/latest/))
いくつか列挙すると
・インデントはスペース4文字
・1行の長さは基本的には79文字
・変数や関数は小文字(スネーク)、クラス名はキャメルで書く
・importは行を分ける
などなどです。一度読んでみるといいかと思います！

# 最後に
とても内容が薄いですが…また続編書きたいな…
それでは Merry Xmas!! & 良いお年を〜〜！！！！！！！

[Tips①はこちら](http://qiita.com/hanaken_Nirvana/items/712cab619b7d37b9674c)
[Tips②はこちら](http://qiita.com/hanaken_Nirvana/items/e533e88e3d5a32cc8a2a)
Data import

https://github.com/mugoweb/data_import

https://www.mugo.ca/Extensions-and-Tools/Extensions/Data-Import

```
php extension/data_import/scripts/run.php -i ImportOperator -d XMLFolders
php extension/data_import/scripts/run.php -i ImportOperator -d XMLImages
```

```
php extension/data_import/scripts/run.php -i ImportOperator -d CSVFolders
php extension/data_import/scripts/run.php -i ImportOperator -d CSVImages
```
Xamarin導入を検討されてる企業向けのイロハ

こんにちは。エクセルソフトの田淵です。

遅れましたが、Xamarin使ってみたいなという企業の方向けの情報を書いていきたいと思います。

本ドキュメントを読んで役に立つ方：企業の開発者、開発チームのリーダー、経営者(特にC# がメインの会社)

> 個人開発者の方で「C# は書けるけどiOS／Androidもやってみたいな」という方は、今すぐXamarinに手を出してこれから来るであろうビッグウェーブに備えましょう。Visual Studio Communityも無料ですし、必要なのはやりたいという強い気持ちだけですよ！(^^)

### 企業でXamarinを導入するのに必要な費用

まず、一番大事なことですが、[Community Editionの対象となる企業](https://www.microsoft.com/ja-jp/dev/products/community.aspx)を除いて、企業でXamarinの開発するのはタダではありません。開発対象がiOS／Androidの場合は、Visual Studio with MSDN Subscriptionという製品が必要になります。

詳しくは [Xamarinのライセンスを整理してみた \- nuits\.jp blog](http://www.nuits.jp/entry/2016/05/06/174037) をご覧ください。

永続ライセンスの場合は、最低75,000円／年(MSDNは2年毎の更新なので初期費用としては150,000円くらいです)くらい、終了すると使用権が無くなるサブスクリプションのみで良ければ55,000円／年くらいの金額となります。

加えて、開発者1名に付きMacマシンが1台必要です。ビルドだけならMac Miniでも耐えられると思いますので、初期費用は永続ライセンスの場合で20万円くらい、サブスクリプションで13万円くらいでしょうか。

大企業の場合はMSDNを企業契約している事が多いので、社内の情シスなどライセンスを管理している部門に聞いてみて下さい。

※ライセンスについて詳しく知りたい方は [@ytabuchi](https://twitter.com/ytabuchi) までお問い合わせ下さい。

### なぜXamarinなのか

そんなお金の掛かるXamarinをなぜ使うのでしょうか？

仮にみなさんの職場でiOS／Androidの開発をやらねば！となった時に、iOS／Androidネイティブ開発ができる人がいない場合、新たに派遣、フリーランスまたは社員を雇う必要があります。派遣の方がすぐに見つかるとは限りませんし、3ヶ月の短期間でも紹介会社への支払いや様々な経費を含めると１００万円くらいはすぐに掛かってしまうでしょう。

そしてなにより、開発を丸々お願いした場合社内にノウハウが残りません。

C# がメインの企業であれば、Xamarinが最良の選択肢です。Javaがメインの企業でもXamarinがなかなか良い選択肢になるでしょう。C# 開発者が既に社内にいる場合、ほぼ間違いなくVisual Studioをお持ちだと思います。既存のコストに追加すべきはMacのマシン代だけです。

安定したC# という言語を使用して、iOS／Android／Macアプリが作れるXamarinであれば、これらのアプリに使用したロジックをWindowsデスクトップ向けのWPFアプリと共有することもできます。

色々意見はあると思いますが、C#er には最高の環境です。

[@nuits_jp](https://twitter.com/nuits_jp)さんの [私がXamarinを選びたい理由 \- nuits\.jp blog](http://www.nuits.jp/entry/why-xamarin-for-my-background) も参考になるかと思います。

Objective-C／Swift／Java／Kotlinで既にアプリを開発している企業でも、実はXamarinの導入が少しずつ進んでいます。同じ言語で記述でき、ロジック部分を共通化できる点に魅力を感じて頂いているようです。

### どうやって採用を促すか

そんな素晴らしいXamarinですが、実際に採用してもらおう、となった時には、ボトムアップ、トップダウンのケースがあるかと思います。トップダウンで採用してもらうためにも、日本マイクロソフトに頑張ってもらいたいところですね。大企業であれば、事例が重要になるでしょうし、中小企業であれば、Microsoftが公式にXamarinを採用して、OSSにコミットしている点を担当の方の熱量でプッシュすれば試しに採用になるかもしれません。

やはり色々な方に可能性を感じてもらうことが必要です。

多くの場合、ボトムアップで社内啓蒙活動をすることになるかと思います。そんな時は、社内勉強会、社内ハンズオン、ハッカソンなどがお勧めです。先日の記事で [日本語ドキュメントを見ながら出来る各種ハンズオン](http://qiita.com/ytabuchi/items/c1cd365bf10d2385d847#%E6%89%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99) を紹介していますので、是非社内でXamarinに興味のある方を集めてやってみて下さい。
私を呼んでいただければ、全部が全部ではありませんが、参加出来るように調整も可能です。

また、現在私の所属するエクセルソフトでは、Xamarinで開発が出来るパートナーを募集しており、もう少しで発表できる予定です。開発できる会社がこれだけあるのか。ということが分かれば、Xamarinの案件をやれるかどうか分からなくても、パートナーさんと一緒にチャレンジする。とかは出来るようになると期待しています。

Xamarinの案件がより増えて、開発できる会社が開発を受託したりサポートしたりしてもっともっとXamarinでの開発がメジャーになっていくように私も頑張りますので、皆さんも社内啓蒙活動を頑張っていただければ嬉しいです。

ちょっとポエムっぽくなりましたが、導入を検討されている企業の方へのヒントになれば幸いです。

以上です。
集中できる時間にやるべきこと

# はじめに
[Advent Calender2016 新人エンジニア](http://qiita.com/advent-calendar/2016/freshman_engineer) に寄稿させていただきました。

社会人二年目のみやもとです。
大学では数学という、全くIT関係ないとも言えないところから、今は主にサーバサイドのエンジニア半分とエクセルおじさん半分を生業としています。

Qiitaなどで発信する機会と言うか時間がなかなか取れてないのですが、**偶然にも**25日が暇暇アンド暇だったかつ、いい経験にもなるだろうと思い参加させていただきました。

1年半かかってやっと自分が一番集中できる時間を認識し、その時間にやるべきことやるべきでないことが、なんとなーくわかってきたので書いてみたいと思います。
ここに書かれたことが少しでも皆様のエンジニア生活の糧となれば嬉しい限りです。

# 時間の使い方

## はじめに認識すべきこと
エンジニアたるもの**「生産性を上げろ」**と上から口うるさく言われるのは逃れられない運命だと思います。
生産性を上げるために「集中してタスクを実行する」のが必要であると私は考えています。そのためにまずは自分が最も集中できる時間を認識してください。(業務時間すべてで集中できればいいのですが残念ながら私はそんな能力は備わっていないようです…)

私は9時に出社してから30分後から11時半までが、もっとも集中できる時間であると認識しています。

## 集中できる時間にやるべきこと
### タスク管理 (30分 ～ 1時間)
仕事を効率的に行う上では計画が最も大事だと最近ものすごく痛感しています。
整理する内容としては、

- 当日の予定
- 次にタスク管理を行う時間までに実行すべきタスク
- 他者の対応待ちにになっているタスク

の確認と洗い出しです。

タスク粒度としては「何を」「いつまでに」「どうやって作成」「誰に確認してもらう」の4つがかければ十分だと思います。(背景まで記載されているとなおさら、タスクに大義名分ができて実行意欲が増すので、なおさらいいと思います。)

正直、計画さえ建てられてしまえばその日一日は勝ったようなもんです。

### 複雑なタスクへの対応 (残りの集中時間)
当たり前かもしれませんがタスク管理で整理した中で複雑だと思った内容は残りの集中時間で実行しましょう。集中力が切れた状態で複雑なタスクに挑むことほど時間の無駄なことはないでしょう。

## 集中できる時間にやってはいけないこと
ついつい自分が集中時間にやってしまいがちなことを自分への戒めも含めて記述します。

### 情報、ニュースサイト閲覧
Qiitaに投稿させてもらっていてこんな事を書くのもアレですが、集中時間に情報サイトを見るなんてもったいないです。
集中できる時間は頭使いましょう頭。

しかし、新しい情報や多角的な情報を集め、自らの糧にするのはエンジニアたるもの絶対に必要なものです。
複雑なタスク実行が終わったあとにクールダウンの一つとして行いましょう。

### チャットの確認
最近ではSlackなどのチャットを用いた開発現場が当たり前になっていると聞きます。私の会社でもチャットツールが導入されていますが、通知の内容を確認していると、意識がそちらに行ってしまい、集中が切れてしまいます。
私はできるだけチャットの通常通知の確認は避け、ダイレクトメッセージの確認のみに絞っています。

### メールの返信
メールの返信なんて期限が決められていない限り数時間遅くなったって全く問題になりません。まだまだ私はこの稚拙な文章を見て分かる通りメールを一本打つのにも丁寧語尊敬語謙譲語をググりつつやっています。
メールのテンプレなんてクソほど世の中に溢れているのですから、自分の頭で考えて生み出すのではなく遠慮なく先人の知識を活用させていただき、ゆっくりと書きましょう。

### その他単純作業
エクセルの内容をコピペなど、マニュアルがあるものや、やり方が決まっていてそれ以上改善の余地のないものは当然、集中時間にやるべきではありません。セブンのスイーツでも食べながらやりましょう。

# 集中力を切らさないためのツール3つ
次に自分が最近愛用している集中力を下げないをツールを紹介します。
エンジニアの皆様にとっては当たり前に活用されているものであったり、これより良い物wをお使いかもしれませんが暖かい目で見守っていただければと思います。

そもそも集中を切らさないツールとは、「自分が必要だと考えたときに瞬時に答えを返してくれるもの」だと考えています。
例えば、私の場合は「あー、これやるために、あのファイル確認しないと…あのファイルはあのフォルダ以下のどこだっけ…」みたいなことが多く、ここで思考が別の指向(激ウマ)へとおさらばしてしますことがよくあります。集中力を持続するのを補助してくれるツールたちです。

## Trello
「次のタスクなんだっけ？」や上司から「あのタスク今どうなってる？」を一発で解決してくれるWebサービスです。
作業用とは別のディスプレイで常に見える状態にしておくことが理想です。今日実行するタスクがどんどんDoneに放り込まれていく様子で達成感を得ることができ仕事のやる気を引き出してくれます。
「Publicサイトに情報載せるのはちょっと…」て方はWekanというクローンがありますのでこちらを使いましょう。

## Launchy
ランチャーです。Alt+Spaceから自分の脳内単語をぶち込むだけでOKでそこにたどり着く道順を大幅に削ってくれます。
私は今の開発現場がファイルサーバに大量に設計資料などが複雑に統一性なく配置されているので、フォルダまでのショートカットを作ってすぐにみたいファイルを見れるようにしています。

## Vivaldi
ブラウザです。なんと言ってもF2のクイックコマンドに限る。長々とお気に入りのフォルダや履歴をたどる必要なく頭に浮かんだ単語を打ち込むだけでOKというのが素敵...

# 最後に
偉そうに色々述べさせていただきましたが、一つでも皆さんの生活に役に立てばと思います。

以上、ありがとうございました。
eZ Publish で詳細なシステム情報が確認できるエクステンション「ggsysinfo」

## ggsysinfo エクステンション
https://github.com/gggeek/ggsysinfo

![ggsysinfo.png](https://qiita-image-store.s3.amazonaws.com/0/15175/afd67ef7-5471-30e0-57c7-b684ec9e86b9.png)
Atomのautocomplate-plusでTabで次候補、Shift+Tabで前候補に移動しEnterで確定するようにする

![atom.gif](https://qiita-image-store.s3.amazonaws.com/0/4194/64ddff30-0bf4-49a4-3b3a-442f60f9bb80.gif)


Settings>Packages>autocomplate-plus>SettingsのUse Core Movement Commandsでチェックを外す。

Settings>Keybindings>your keymap fileにて以下を記述。

```yaml
'body atom-text-editor.autocomplete-active':
  'ctrl-p': 'autocomplete-plus:move-up'
  'ctrl-n': 'autocomplete-plus:move-down'
  'tab': 'autocomplete-plus:move-down'
  'shift-tab': 'autocomplete-plus:move-up'
  'enter': 'autocomplete-plus:confirm'
```

ついでに自分は文字入力中の手動で補完に行く場合はctrl+spaceがMac自体で設定しているショートカットとかぶるので、以下のようにTabに変更している。

```yaml
'atom-text-editor':
  'tab': 'autocomplete-plus:activate'
```
2時間でApple Watchプロジェクトを作ってみる

# Swift3でアプリを作るまで。
新幹線内でアプリを一本作ろうと思いたちました。
2時間の一人ハッカソンです。

## プロジェクトを作る
<img width="360" alt="スクリーンショット 2016-12-22 16.41.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/62650/5b4412cb-92c9-7627-ab74-295d48bb76cd.png">
Xcodeのプロジェクト作成よりwatchOSを選択

<img width="720" alt="スクリーンショット 2016-12-22 16.42.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/62650/384b2498-fefd-2230-66b3-41f35d0dcf12.png">
Project NameとOrganization Nameを入力。
今回のProject NameはxmasTheEndとします。

<img width="1440" alt="スクリーンショット 2016-12-22 16.45.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/62650/8e09efcf-1889-65fa-314b-077bd68805c7.png">

こんな感じでファイルが生成されるのですが、watchOS用のファイル群は存在していないので作成します。
プロジェクト名を右クリックしてAdd Targetを選択

<img width="1440" alt="スクリーンショット 2016-12-22 16.46.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/62650/ac2ec683-7f7c-f87d-a379-31f4ea29622a.png">

watchOSタブを選択してWatchKit Appを選択します。

<img width="1440" alt="スクリーンショット 2016-12-22 16.48.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/62650/3f21fa99-328b-a207-a6c3-8ee835df7ea2.png">

watchOS用のプロジェクト名はwatchXxxxxxといったようにwatchをサファックスするのが習わしみたいです。
今回はwatchXmasTheEndとします。
※スクショではタイポしています。

## Swiftを書く
プロジェクトの作成がメインなのでコードの紹介は控えめにします。
アプリの概要はボタンをタップするとサンタが消滅する、タップしないと増え続けるといったものです。

<img width="1440" alt="スクリーンショット 2016-12-25 21.55.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/62650/ea9a0078-b9ea-0f9a-24a8-88620f40e35c.png">

watchプロジェクトのstoryboardにアイテムを追加し、アイテムに対するコードを記述していきます。

今回使用したアイテムはLabelとButtonのみです。

今回はApple Watch単体で動作する単純なアプリなのでコードはControllerに書いてしまいます。


### iOSとちゃうやんけ
iOSではUILabelやUIButtonといった名称のフレームワークを使用しますが
watchでは同じようなアイテムでも微妙に違うWKInterfaceLabelやWKInterfaceButtonといったフレームワークを使用します。
iOS開発者がいきなりwatchを触ると混乱する気がします。

厳密にはWatchKitに集約されています。
ただ、UIKitの記法で書くとXcodeが自動でWatchKitの記法に変換するので、使い方がわからない場合はiOSを参考にするといいと思います。

### 使ったアイテムの例
`@IBOutlet var explosionButton: WKInterfaceButton!`
Buttonを宣言します。

`@IBAction func TouchExplosionButton() {
    処理
}`
ボタンタップに対する処理を記述します。


`Timer.scheduledTimer(timeInterval:1.0,　target:self,　selector:#selector(InterfaceController.additionSanta), userInfo: nil, repeats: true)`
タイマー処理です。
指定した秒数毎に処理を繰り返すことが可能になります。
ここでは1秒ごとにadditionalSanta()を繰り返し呼び出します。


## 実行する
<img width="1440" alt="スクリーンショット 2016-12-25 22.13.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/62650/404e79b1-c1c4-c36e-097d-812ee1125517.png">

Xcode左上の▶︎をクリックすればビルドされ、エミュレータ(もしくは実機)にでバックモードで実行されます。
簡単ですね。

新幹線の中ではこれが限界でしたがアプリ一本を作ることはできたので満足しました。


![タイトルなし2.gif](https://qiita-image-store.s3.amazonaws.com/0/62650/6dbbb231-a6ad-e00c-da2d-2738b1b15811.gif)
キズナアイちゃんにUnityで恋ダンスを踊っていただく

# 成果物（クリックでYoutubeへ）

[![](https://img.youtube.com/vi/164cBwNGGWU/0.jpg)](https://www.youtube.com/watch?v=164cBwNGGWU)

# 使用した要素

* モデル http://kizunaai.com/download.html
    * ライセンス的にはキャラを毀損しないものの制作なのでOK
* MMD Motion http://www.nicovideo.jp/watch/sm30009373
* MMD4Unity
    * MMD->fbxにモデルもモーションも変換
* BGM「恋」の著作権問題
    * 1.5分なら著作権的にOK https://www.youtube.com/watch?v=7xuXlpvWw1I
    * http://www.itmedia.co.jp/news/articles/1611/24/news067.html
* 部屋画像 http://01.gatag.net/0011587-free-photo/
    * PlaneにUnlitシェーダではりつけてキャラの後ろに配置
* Planeでメッシュ描画せず影だけ描画する　下の#18のシェーダを使用
    * https://forum.unity3d.com/threads/matte-shadow.14438/ 
    * 影落とし用に見えないPlaneが床に敷いてある

![AnimationCheck.unity - KizunaAi - PC, Mac & Linux Standalone (Personal) <OpenGL 4.1> 2016-12-25 17-01-38.jpg](https://qiita-image-store.s3.amazonaws.com/0/12309/117307b8-de05-b736-04fa-703b1b05f484.jpeg)

* 配置
    * Apply Root Motion = true

* 揺れもの
    * DynamicBone
        * Rootが設定されてなかったら自身を設定するようにScript書き換える
    * 髪とリボン
        * もみあげにmomiなどと名前が付いている
        * 各ボーンにHairって書いてくれていたら探しやすい。Hierarchyでリネームしてhairと書き加える
        * パラメータ調整
    * 肩に刺さらないようにコライダ
        * kataで検索 Radius=0.1
        * DynamicBone側のInspectorからCollider設定
    * Playのはじまりで揺れものがあばれるのが見えてしまう
        * 1秒待ってからBGM, アニメーションを開始しよう
        * そこから録画用に切り取ればいい


![AnimationCheck.unity - KizunaAi - PC, Mac & Linux Standalone (Personal) <OpenGL 4.1> 2016-12-25 17-42-55.jpg](https://qiita-image-store.s3.amazonaws.com/0/12309/73b9dc35-7891-8253-2398-dd0c03bc5b72.jpeg)


* スクリプト
    * 踊ってるので口で呼吸
    * 目パチ
    * どちらもBlendShapeで
    * BlendShape Index=30のカメラ側を見るのは常にweight=100

![Mepachi.unity - KizunaAi - PC, Mac & Linux Standalone (Personal) <OpenGL 4.1> 2016-12-25 19-05-06.jpg](https://qiita-image-store.s3.amazonaws.com/0/12309/035e04a4-2ddd-ed83-96f8-879ada2d52b7.jpeg)

*  アニメーション開始したときに位置と回転がずれる件
    * AnimationClipの設定で解決

![AnimationCheck.unity - KizunaAi - PC, Mac & Linux Standalone (Personal) <OpenGL 4.1> 2016-12-25 20-37-19.jpg](https://qiita-image-store.s3.amazonaws.com/0/12309/c4e2f221-3b99-e60c-b7a3-3c1c1a297030.jpeg)



* Image Effectのせて最終調整
    * Anti Aliasingを入れることで境界の黒い点々を抑える
    * 顔もすこしボケてしまう

* PCアプリケーションとして出力して撮影
    * EditorよりFPS上がる
    * Editorでは30FPS

* 録画
    * 録画を始めてから踊り始めてほしいので、スタートシーンを用意して、ボタンを押すと踊るシーンに飛ぶようにした
    * メモリが足りないと録画途中で止まる

* 編集
    * Premiereで音とくっつける（音がとれてなかった・・）
    * 不要な前後の部分を切り取る
    * 読み込んだ動画のサイズが2500x1200とかになっていて、プレビューがカクカクした。大きくキャプチャしすぎた
    * 音合わせの確認をしやすくするように、適切なサイズでキャプチャすること
    * Exportするときに1280x800にリサイズ

* カスタムサムネイル
    * Photoshopで作成
        * かわいいフォントをインストールし、文字を書き、枠線もつける
        * サムネと題名は入り口。とても大事

# 2017追記：音源がミュートされた

* 上にあるとおり、CD音源を使用していいとなっていたが、その期限が過ぎたということで動画がミュートにされてしまった。踊ってみた動画を上げていた人も削除するように公式が言っていて問題となっている。他の動画を見てみると、JOYSOUND音源や歌ってみた音源を使っている人たちの動画はミュートになっていないので、リスク回避としてそういう音源を（公式を信用しないで）使った方が良かった。

# 2017/12/01

* BGMを差し替えてUP

# 2017/12/03

* ダンスとBGMのタイミングのズレを修正。再度UP
ESP-WROOM-02 : ArduinoIDEでSketch書き込み


# ESP-WROOM-02の準備

* [AE-ESP-WROOM-02](http://akizukidenshi.com/catalog/g/gK-09758/) (650円)
* [超小型USBシリアル変換モジュール AE-FT234X](http://akizukidenshi.com/catalog/g/gM-08461/) (600円)
* [低損失三端子レギュレータ3.3V 500mA TA48M033F](http://akizukidenshi.com/catalog/g/gI-00538/) (100円)

![ESP-WROOM-02_回路図.jpg](https://qiita-image-store.s3.amazonaws.com/0/149150/b6914916-edd9-6b15-45fe-2b54cb77c4a9.jpeg)

ブレッドボードだと何回も書き換えしようとすると大変なので..

![ESP-WROOM-02_jig.jpg](https://qiita-image-store.s3.amazonaws.com/0/149150/de38bfdd-41e9-8c2c-572b-159193ca4b21.jpeg)

電流が小さいのでサーボとかブザーとかはまともに動きません. 

* (参考) [三端子レギュレータの使い方](http://www.riric.jp/electronics/design/power/regu3pin_usage.html)
* (参考) [ESP-WROOM-02開発ボード 参考回路図](https://s3-ap-northeast-1.amazonaws.com/switch-science.public/schematic/ESP-WROOM-02_devboad/ESPr_Developer_rev3.pdf)

# Arduino IDEの設定

* (参考)  [Arduino IDE に Stable ( Staging )版 ESP8266 ボードをインストールする方法](https://www.mgo-tec.com/esp8266-board-install01-html にあるURLを環境設定の追加のボードマネージャURLに追加))

 ボードマネージャでArduinoIDEにボードを追加して，"Generic ESP8266 Module"  を設定 (https://github.com/esp8266/Arduino)

![ESP-WROOM-02_ArduinoIDE.png](https://qiita-image-store.s3.amazonaws.com/0/149150/bb2c14a2-3756-67cd-6f74-4f50f910272c.png)

* 手動でIO0を操作するため，Reset Methodはckに設定
* Flash SIze は 4M(3M SPIFFS)でも動作するみたい
* (参考) [ESP-WROOM-02: SPI Flash の更新(書き戻し)](http://qiita.com/kummn/items/74dcd93e51baf66f1aed)

# 書き込み手順

1. IO0をpulldownして電源ON
2. Arduino IDEでSketchを書き込み
3. 一旦電源OFF
4. IO0をopen(ESP-WROOM-02は内部pullup) or pulpupにして電源ON

## ESP8266 Sketch サンプル

Sketchの例 -> Example for Generic ESP8266 module -> ESP8266Wifi -> WifiClient

ssid, password を設定したうえで，hostに適当なWebサーバを設定して, url = "/"; にして確認．

* BUILTIN_LEDは GPIO1 になっているが，ESP-WROOM-02 では設定すると死ぬので別のportを使うこと

# 参考

[ESP-WROOM-02 Datasheet](http://espressif.com/sites/default/files/documentation/0c-esp-wroom-02_datasheet_en.pdf) ([ESPRESSIF公式ドキュメント](http://espressif.com/en/support/download/documents))


![ESP-WROOM-02_pin.png](https://qiita-image-store.s3.amazonaws.com/0/149150/abd3bdca-dedf-10bb-0f78-98332a16062b.png)
ESP-WROOM-02: SPI Flash の更新(書き戻し)



* Firmware : [ESP8266 NONOS SDK V2.0.0 20160810](http://www.espressif.com/sites/default/files/sdks/esp8266_nonos_sdk_v2.0.0_16_08_10.zip)

  * ESP8266_NONOS_SDK\bin\at\README.md
  * ESP8266_NONOS_SDK\bin\blank.bin
  * ESP8266_NONOS_SDK\bin\boot_v1.6.bin
  * ESP8266_NONOS_SDK\bin\esp_init_data_default.bin
  * ESP8266_NONOS_SDK\bin\at\1024+1024\user1.2048.new.5.bin

* Flash Download Tool : [ESP8266 Flash Download Tools V3.3.6](http://espressif.com/sites/default/files/tools/flash_download_tools_v3.3.6_win.zip)


アドレス設定は [ESP8266 AT Instruction Set](http://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf) を確認．

## SPI Flashのサイズは？

* 最初から搭載しているFLASH情報
通常起動してその時のbootログからFlashサイズを確認する．(76800bps)

```
2nd boot version : 1.4(b1)
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000
```

なので，defaultで書き込まれているFlashのサイズは 8Mbit(512KB+512KB)

でも，本当はもっと積んでる？

* [ESP-WROOM-02を使ってみる2　-外付けSPIフラッシュの書き換え-](http://nemuisan.blog.bai.ne.jp/?eid=215341)
>さて、先に結果を言ってしまいますがESP-WROOM-02は実際に32MBit(=4Mbyte)のSPI-ROMを持っています。それにしたがってこちらのエントリのにある2B-ESP8266_Non-OS_SDK_IOT_Demo_Guide_CN.pdfの23ページ目の4096kByte Flashを参考に各バイナリを書き込むアドレスを指定していきます。
>32Mbit-C1(1024+1024)

* [WROOM-02を最新ファームV1.5.4に更新してみる](http://bmicom.dmsk.com/wroom-02/firmware-update)
>32Mbit-C1(1024+1024)

* 公式の esp8266_quick_start_guide_en.pdf では，
>16Mbit-C1(1024+1024)

結局秋月のページを確認すると，**32Mbit-C1(1024+1024)**  
これが正解のようでした．
http://akizukidenshi.com/catalog/g/gM-09607/

>◆主な仕様
・電源電圧：３．０～３．６Ｖ
・消費電流：平均８０ｍＡ
・対応ＷｉＦｉプロトコル：８０２．１１ｂ／ｇ／ｎ（２．４ＧＨｚ）
・サイズ：１８ｍｍ×２０ｍｍ×３ｍｍ
・端子ピッチ：１．５ｍｍ
・Ｗｉ－Ｆｉモード：ｓｔａｔｉｏｎ／ｓｏｆｔＡＰ／ＳｏｆｔＡＰ＋ｓｔａｔｉｏｎ
・セキュリティ：ＷＰＡ／ＷＰＡ２
・暗号化：ＷＥＰ／ＴＫＩＰ／ＡＥＳ
・内蔵フラッシュは４メガバイト（３２メガビット）です。
anyone can host vector tiles

# anyone can host vector tiles
この記事は、[FOSS4G Advent Calendar 2016](http://qiita.com/advent-calendar/2016/foss4g)の12/25の記事である。

## 目的
バイナリベクトルタイルが隆盛している。バイナリベクトルタイルは数年も昔から実用されてきたが、事実上の標準としてのフォーマットが定まりつつあるためだ。事実上の標準が定まりつつある今、バイナリベクトルタイルの隆盛を加速するために必要なことは、多数の実装が世の中に現れることだ。

バイナリベクトルタイルの事実上の標準が定まりつつあり、そのファイルを作る方法もオープンソース実装をつないで実現できる。

また、基本図以外の多くの地理空間情報は小規模である。バイナリベクトルタイルは大規模データでも賢く空間的に分割して統治するところが強みであるが、大規模データでも問題がないバイナリベクトルタイルの手法は、小規模なデータでも簡単に適用できる。

小規模なデータを持つ多くの方に、バイナリベクトルタイルでデータを出して欲しい。今、バイナリベクトルタイルは、小ロット生産者とともに歩むべきである。

バイナリベクトルタイルは、ファイルセットとして展開すれば、小さなファイルの塊にすぎない。このようなファイルセットは、例えば gh-pages のようなサービスで簡単にホストすることができる。

GeoJSON ベクトルタイルではファイルセットが大きすぎて実現できなかったホスティングが、バイナリベクトルタイルの圧縮と間引きのおかげで、gh-pages のような無償ホスティングの範囲ですら実現できるようになったことは、とても大きい。

今や、例えば Shapefile で表現できるようなほぼあらゆるデータは、誰でもベクトルタイルとしてホストできる。その上のレベルでの勝負に進むべきである。

## 実証
基本図ではないデータで、それなりの規模のあるデータとして「電子国土基本図(地名情報)住居表示住所」を選定し、これをバイナリベクトルタイルに変換して gh-pages にホストし、ウェブ地図（表示サイト）を作成した。具体的には https://hfu.github.io/gsi-address-vt/ である。この地図の作成に当たっては、国土地理院長の承認を得て、同院発行の電子国土基本図(地名情報)住居表示住所を使用した。(承認番号 平28情使、第679号)

この地図を使うと、住居表示住所データを次のように地図表現することができている。

<img width="731" alt="スクリーンショット 2016-12-25 22.15.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/049abce4-bdf5-6df5-3d99-634382ecc480.png">

<img width="731" alt="スクリーンショット 2016-12-25 22.16.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/e2cbeb3f-fe49-0c40-6225-f1c20ca7b38d.png">

<img width="731" alt="スクリーンショット 2016-12-25 22.16.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/713a0ea1-7bf9-f267-41c3-c9289e5cf026.png">

<img width="734" alt="スクリーンショット 2016-12-25 22.17.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/6742d507-c93f-0fad-4a62-de7eb2420cf7.png">

<img width="729" alt="スクリーンショット 2016-12-25 22.17.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/95580a7c-2ece-85b5-421a-85d478b4685e.png">

この地図の作り方の詳細をいま説明することができないが、詳細は間違いも含めて [GitHub](https://github.com/hfu/gsi-address-vt) のソースコードに記載されている。質問があれば、GitHub Issue などに頂けるとありがたい。
Laravel5.3で/apiをURLから消す方法

# 結論
* RouteServiceProvider.phpのmapApiRoutesメソッドのprefixをnullにする。

```php
 69     protected function mapApiRoutes()
 70     {
 71         Route::group([
 72             'middleware' => 'api',
 73             'namespace' => $this->namespace,
 74             'prefix' => null,　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　// ココ！！
 75         ], function ($router) {
 76             require base_path('routes/api.php');
 77         });
 78     }
 79 }
```

# frameworkにあらかじめある、routes/api.phpをつかいたい
* api.php名前ついてるから、apiはこれつかうよね普通
* ところが、URLは/apiが必ず固定される、http://localhost/api/hogehoge てな感じ

# route.php
* https://hogehgoe.com//hoge みたいになって泣きました。
* 結局Laravelのソースコードを追いかけると
* Illuminate/Routing/Router.php

```php
 503     /**
 504      * Prefix the given URI with the last prefix.
 505      *
 506      * @param  string  $uri
 507      * @return string
 508      */
 509     protected function prefix($uri)
 510     {
 511         return trim(trim($this->getLastGroupPrefix(), '/').'/'.trim($uri, '/'), '/') ?: '/';    // これだから
 512     }


 426     /**
 427      * Get the prefix from the last group on the stack.
 428      *
 429      * @return string
 430      */
 431     public function getLastGroupPrefix()
 432     {
 433         if (! empty($this->groupStack)) {
 434             $last = end($this->groupStack);
 435
 436             return isset($last['prefix']) ? $last['prefix'] : '';    // これで
 437         }
 438
 439         return '';
 440     }
```
* prefixの行を消すのではなくて、nullにしてやれば思い通りのURL体系になります。
Pylintを導入してみた

# 目的
pylintの使いだしについて整理します。

# このページでわかること
pylintの導入方法
Jenkinとの連携方法(おまけ)

# 前提条件

1. Python 3.5.2
2. Ubuntu 16.04
3. pyenv利用

# 手順

## Pylintの導入

pipをつかってpylintをインストール

```bash:pylintインストール
pip install pylint
```

## Pylintの設定ファイルの取得

デフォルトの設定のままでも利用は可能ですが、
設定ファイルを出力しておいたほうが後々都合が良いです。

```bash:pylintの設定ファイル取得
pylint --generate-rcfile > pylintrc
```

## Pylintの設定ファイルを使った実行

```bash:pylintの設定ファイルを指定しての実行
pylint --rcfile=./pylintrc *
```

# Jenkinsとの連連携携

## Jenkinsで解釈可能な結果ファイルの出力

Jenkinsで解釈可能な結果ファイルを出力するには、
以下の内容を記述します。

```text:pylint設定ファイルへの記述項目
output-format=parseable
reports=yes
files-output=no
```

Jenkins側ではシェルスクリプトを以下のような形で
実行し、結果ファイルを取得します。

```bash:pylintの実行
pylint --rcfile=./settings/pylintrc *.py > pylint_result.log
```

ビルド後の処理として、"Report violations"を設定しておくことで、
結果をグラフィカルに管理することができます。
pylintの対象としてpylint_result.logを指定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/40692/00a0bd0d-1411-9994-4a32-97f31e166700.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/40692/ddb2e24d-c53c-523a-f28f-81b7dd946d92.png)
ワークショップ よもやま話：03 " littleBits では足りない "

この記事は [littleBits Advent Calendar 2016](http://qiita.com/advent-calendar/2016/littlebits) 24日目の記事です。

# **Happy Holidays!**
さあ、カレンダーもいよいよクリスマスってかんじですね。
littleBitsで作った、これぞクリスマスってかんじの作品を紹介しつつ、いろいろ書こうと思ったのですが、littleBits 本国にしても、その他のグローバルなプロダクトにしても、宗教的な多様性を尊重しているところはもはや「メリークリスマス」なんて言ってないわけです。
なので、littleBitsの各SNSを #Christmas で検索してもいまいちピンとこない...。
イカした作例は 最終日25日の @tseigo さんのエントリーに任せるとしましょう。

# **Thank you for a wonderful year!**
なので、この僕が担当する最終回は一年を振り返りつつ、littleBitsを客観的に考えながら書いてみようかと思います。
締切時間ギリギリで駆け込み投稿するかもしれないので前もってお礼申し上げます。今年もお世話になりました。ありがとうございました。


# **WE INVENT THE WORLD WE WANT TO LIVE IN.**

さて、littleBits は、とても技術的に洗練されていて、誰にでも使いやすいということは周知の事実。
では littleBits の考え方は何かというと、直近のWEBではこう書かれているわけです。

**WE INVENT THE WORLD WE WANT TO LIVE IN.**

（12月はセールス用のコピーが多いですが、TOPの下の方や、こちらの [#inventforgood の紹介ページ](http://littlebits.cc/invent-for-good) に書かれています）

ぼくはこのメッセージがとても好きです。

日本では、littleBits はプログラミング教育のツールとして紹介されることも多いですし、同様にアメリカでは STEM/STEAM education の文脈が多いかと思います。
こと最近の日本の教育業界では「なんちゃら教育」「なんちゃら授業」「なんちゃラーニング」などのキーワードが多いので、ビジネス的にその文脈に乗っかれるほうに寄せたりすることも少なからずありますが、個人的には、このメッセージのように　"住みたい世界は自分でつくる"　なかんじで、楽しみながら世の中を良くしていこうと思っています。
子どもの教育にプログラミングを、という流れについては、僕たちが住みたい世界をつくるための（どうやら）最短経路（らしいよ）として存在するなら正しいとは思います。
批判するつもりはないですし、この領域で仕事をしているのでdisることが得策でないことはわかっていますが、この littleBits のメッセージからは、結局、僕たち大人の努力も子どもたちの努力も将来の世界をつくるためにある、だけど、言い換えると、僕らがやった通りにしか世界は存在しない、そういう切実な怖さにも思い至るわけです。
産業的な空洞を埋めるためにプログラミングを奨励し、みんなで頑張るのも良し。コンピュテーショナル・シンキングの獲得のためにプログラミングや電子工作を頑張るのも良し。むしろダメなことはないくらい、みんなそれぞれの持ち場で頑張れば、それぞれ幸せで良いんだと思います。
で、話はlittleBitsに戻りますが、そういう教育環境づくりに littleBits が貢献できるとすればなんだろう、と日々思いを巡らせるのです。

# **littleBits では足りない**

で、6月、東京であったイベント「TMCNコミュニティ総会Vol.17 - for Our Kids」でLT登壇した時に、その段階で思っていたことをまとめたのがこんな内容でした。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">りとるびっつでいろんなものを作るといっぱいわかることがあるの(ｹ∀ﾛ)<a href="https://twitter.com/hashtag/TMCN?src=hash">#TMCN</a> <a href="https://t.co/olpoArxjyc">pic.twitter.com/olpoArxjyc</a></p>&mdash; ライム (@opclime) <a href="https://twitter.com/opclime/status/745955194060451840">2016年6月23日</a></blockquote>

- イベントの全体像はこちら： https://togetter.com/li/991196
- イベントの主催者ページはこちら： https://tmcn.doorkeeper.jp/events/46551

littleBits のワークショップをたくさんやってきた僕がいうのは逆説的ですが、

**"littleBits では足りない ということに気が付くこと"**

これはlittleBitsを使ったワークショップの命題だと思います。

# **なにが足りないのか**
ワークショップでは、大量のlittleBitsのほか、紙やスチレンボードなどのマテリアルを用意します。しかも素因数分解のように、マテリアルを使って二次マテリアルを生み出せるくらい根源的なものばかりをセレクトしています。たとえば家を作っていて壁紙が必要になったら折り紙で代用できる。その柄が気に入らなかったら白い紙と画材で自分で描けばいい。あとは時間とのたたかい。そういうイメージです。
ですので、物理的に足りないものはほとんどないのですが、それでも決定的に足りないものがいくつかあるわけです。

- **試行錯誤の数**
- **客観的な質疑応答**
- **他の分野の勉強**

あくまで僕の観測範囲ですし、この3つのうち、1つが、または2つが足りないということもあります。
また、これはほかのワークショップやイベントにも当てはまるでしょうし、これらを満たすことが目的でもありません。
それでも僕が狙うのは、主旨や到達目標をクリアしつつも、これらが足りないということを心の片隅に刻んでおいてもらえるような、そんなワークショップなのです。

<加筆予定>
Processingで音楽に連動する動画が簡単につくれた話

# はじめに
音楽に合わせて動く動画を作りたいなあと思ったので調べていたところ、Processingで簡単にできてしまうことが分かったので試しに作ってみました。

# Minimライブラリで音の取り込み
Minimライブラリを使って、音声シグナルを取込みます。取り込んだ波形シグナルを、FFT（高速フーリエ変換）クラスのメソッドを使って、周波数ごとのシグナルに変換します。

``` java
  Minim minim = new Minim(this);
  AudioPlayer player = minim.loadFile("music.mp3",512);

  // フーリエ変換のインスタンスを生成
  FFT fft = new FFT(player.bufferSize(), player.sampleRate());

  // FFTで波形から周波数のスペクトルに変換
  fft.forward(player.mix);
  // ステレオ音声の左右チャネルを分けたい場合は
  // fft.forward(player.left);
  // fft.forward(player.right);

  // スペクトルのサイズを取得
  int specSize =  fft.specSize();
　// i番目の周波数帯の音量を取得
  float volume = fft.getBand(int i);
```

FFTがしていることは、ざっくりと下のようなイメージです。音声を、音の高さ（周波数帯）ごとに分解して、音量（振幅）のスペクトルに変換しています。
![FFT.png](https://qiita-image-store.s3.amazonaws.com/0/146394/c8dd0433-311e-a092-bca1-e0bab303d58a.png)



# 音声シグナルに合わせて動くように描画
変換した音声シグナルに合わせて動くようにProcessingで描画すれば、簡単に連動する動画ができてしまいます。

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">Processingで動画作成～音楽に合わせてillumination <a href="https://t.co/NfiGMhnWlV">pic.twitter.com/NfiGMhnWlV</a></p>&mdash; Dminor (@Dminor_) <a href="https://twitter.com/Dminor_/status/812595361051090944">2016年12月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Processingソースは下のように書くだけです！とっても簡単。

``` java
import ddf.minim.analysis.*;
import ddf.minim.*;

Minim minim;
AudioPlayer player;
PImage img;
FFT fft;
int specSize;
float volume;

void setup(){
  size(800, 600);
  
  minim = new Minim(this);
  player = minim.loadFile("music.mp3",512);
  // フーリエ変換のインスタンスを生成
  fft = new FFT(player.bufferSize(), player.sampleRate());
  player.play();
}

void draw(){
  background(0);
  stroke(#FFFFFF);
  img = loadImage("illumination_img.png");
  image(img, 0, 0, width, height);
  
  // FFTで波形から周波数のスペクトルに変換
  fft.forward(player.mix);
  specSize =  fft.specSize();

  for(int i = 0; i < specSize; i++){
    // イルミネーションを描画
    float h = map(i, 0, specSize, 0, 360);
    volume = fft.getBand(i);
    int ellipse_width = (int)((int)volume * (h/8));

    if(h >= 0 && h <= 360 && ellipse_width >=10){
      int x = (int)random(0,800);
      for(int w = ellipse_width; w > 0; w -= 2){
        fill(#FFFFFF,30);
        ellipse(x, h+510, w,w);
      }  
    }  
        
    // 周波数帯の最大値を画面幅にマッピング
    float w = map(i, 0, specSize, 0, width);
    // 各周波数帯の音量をlineとして描画
    line(w, height, w, height - volume * 5);      
  }
}

  
void stop(){
  player.close();
  minim.stop();
  super.stop();
}
```

# 終わりに
ProcessingのMinimライブラリを使えば、音楽に連動する動画が簡単につくれることが分かりました。Processingは、Processing.jsとしてjavascriptに移植されていて、HTML5と組み合わせることで、AdobeのAfter Effects上で気軽に扱えるようです（[Processing for AE](http://atarabi.com/kikaku/script/processing/)）。映画やテレビ番組の映像加工にも利用されるAfter Effectsと組み合わせることで、更にリッチな動画がつくれそうです。

# 参考サイト
http://yoppa.org/cuc_proga11/2961.html
http://tasoco.hatenablog.com/entry/2015/04/03/092912
Googleが買収したセキュリティ企業一覧

ついにアドベントカレンダー最終日です。特にオチをつけるつもりはありません。

2016年12月25日までに、Googleが買収したセキュリティ企業を調べてみました。結果から見ると、僕らが日常的に利用しているGoogleプロダクトに組み込まれたっぽい買収案件もあれば、企業政治的匂い沸き立つ案件もありました。興味深い（小並感

ビッグな夢をつかみたい、セキュリティエンジニアの諸兄に対して、何らかのヒントになれば幸いです。とはいえ、2014年３月から全く買収してないので、あらかた買収し終わったか、もしくは内製で全てやる体制が整ったか...

# 要約
* ソース: https://www.cbinsights.com/research-google-acquisitions
    * 調達額は各々シリーズの最初が違うのでアテにしないでください。
    * 種別は私ジャッジでつけました。

| 企業名| 種別 | 買収日 |調達額|
| ---|---|---|----|
| GreenBorder Technologies | エンドポイント防御・仮想化 |2007/5/10| $18M|
| Impermium |アンチスパム・不正アクセス対策 | 2014/1/16 | 
| Interactive Security Group| レピュテーションススコアリング | 2012/6/3  |$9M|
| Postini|エンドポイント防御| 2007/9/10  |$16M | 
| reCAPTCHA | 不正アクセス対策| 2009/8/6  |??|
| SlickLogin| 不正アクセス対策 |2014/2/17 | $20K|
| Spider.io|  マルウェア検知 |2014/2/21 | ??|
| Widevine Technologies|  著作権保護  |2010/12/3| $44M |
| Zynamics | OSS | 2011/3/2 |  ??|
| VirusTotal|データマイニング | 2012/9/9 |  ??|


# GreenBorder Technologies
* メールやウェブサイトの閲覧をオンラインサンドボックスで限定することにより、エンドポイントをマルウェア感染などから防ぐソリューション
* システム管理者が管理サーバで、信頼できるネットワークとアクセス先を定義することで、マルウェア防御、不正なダウンロードを防ぐことができるらしい。
* [チームはChromeのSandbox機能に統合された](http://www.informationweek.com/applications/google-chrome-answers-the-greenborder-mystery/d/d-id/1071520?)

# Imperium
* アンチスパム・オンラインのアカウント防御サービス
* 不正登録、不正ログイン、アカウントハイジャック、ソーシャルスパムから防御する
* 買収前はPinterestやTumblrが使ってたが、今はサービスを停止している。
    * Google内のアンチスパムグループに統合されたらしい

# Interactive Security Group(KikScore)
* 当該サービスに登録した中小企業のレピュテーションスコアを提供することで、登録企業はユーザーに対して信用度を伝えることができる
* 儲からなそうとおもったら、Total Funding $0だった...
* [どうもGoogleは特許を買っただけで、KikScoreの顧客にはGoogle's Trusted Store製品を買うように勧めているらしい。尚、KikScoreからマネジメント層は１人も移籍してないらしい。](http://www.businessinsider.com/google-kikscore-acquisition-shutdown-2012-6)闇が深...おっと誰か来たようだ。

# Postini
* ウイルス・スパム・フィッシングから、メール・インスタントメッセージ・ウェブ上のメッセージを暗号化することでプライバシーを保護する
* 又、通信をアーカイブすることでコンプライアンスを保つ
* postini.comにアクセスするとGsuiteにリダイレクトされるので、Gmailやチャットをアーカイブする機能に統合されたっぽい。

# reCAPTCHA
* 説明不要。これ。
![](https://i.imgur.com/yVjInu9.png)
* 企業名継続案件

# SlickLogin
* パスワード認証や２段階認証を、デバイスから発する高周波音に置き換えることで、認証を強化するもの。謎。
    * 少なくともGoogleの2段階認証にはまだ登場していない...
* slicklogin.comにアクセスしようとすると403エラーになる。謎

# Spider.io
* 不正なオンライン広告を経由して感染するマルウェアに対するソリューション
    * 感染したPCを検知することで、オンライン広告が世にばまかれることを防ぐ

# Widevine
* デジタル著作権管理機能(DRM)を提供する。これでアプリ内の動画を保護する。
* GoogleのChromeブラウザ/Chromecast/Daydreamなど様々なサービスで利用されている
    * Androidにおいては、Nからは全く対応しなくなるらしい。 ["starting with Android 6.0, there is no expectation of a Widevine Classic client to exist on any Android device."](https://www.widevine.com/product_news.html) オウイェ〜。
* 企業名継続案件その2

# VirusTotal
* え、Googleが買収してたの？
* 説明いる？要らない気がする。これ。

![](https://i.imgur.com/k6rTgN7.png)

* 企業名継続案件その3

# Zynamics
* え、Googleが買収してたの part2。
* BinDiffやBinNavi(リバースエンジニアリングツール)などの有名なツールを無料で提供している。
* 企業名継続案件その4
macOS(OSX)からCUDAを削除

以前使っていたMacBook Pro (Retina, 15-inch, Mid 2012)にはnVidia製のGPUが入っていたのでCUDAが利用可能でしたが、
以降のMacBookはRadeonのGPUが載るようになったためCUDAの利用ができなくなりました。

新しいMacBookに移行した際コピーされたCUDAのアンインストール方法について調べたのでメモを残しておきます。

# アンインストール

```
# インストール時のバージョンによってアンインストーラーの名前が異なります
sudo /usr/local/cuda/bin/uninstall_cuda_7.5.pl
sudo rm -rf /usr/local/cuda
sudo rm -rf /Library/Frameworks/CUDA.framework
```

# システム環境設定からCUDAを削除

```
Controlキーを押しながらCUDAを右クリック＞"CUDA"環境設定パネルを削除
```

以上です。